1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-10-17 06:57:38 +00:00

Compare commits

..

5 Commits

Author SHA1 Message Date
SquidDev
2a17585702 Merge branch 'mc-1.15.x' into mc-1.16.x 2020-07-18 12:24:49 +01:00
SquidDev
087c305b0d Fix non-inventory GUIs rendering labels 2020-07-18 12:17:02 +01:00
SquidDev
31764f6d65 Register various gold items as piglin_loved 2020-07-18 11:14:55 +01:00
SquidDev
4efde2b294 Merge branch 'mc-1.15.x' into mc-1.16.x 2020-07-18 10:34:29 +01:00
SquidDev
46595e73df Initial update to Minecraft 1.16.1
A lot is broken, but at least we can get in game:
 - GUIs render a whole bunch of additional "inventory" text, which we
   really don't want.
 - Computers load from the wrong location.
 - There's some issues with using Forge's tags from outside of JSON
   recipes. We need to work out why.
2020-07-11 20:36:10 +01:00
139 changed files with 666 additions and 1383 deletions

View File

@@ -12,5 +12,4 @@ labels: bug
## Useful information to include: ## Useful information to include:
- Minecraft version - Minecraft version
- CC: Tweaked version - CC: Tweaked version
- Logs: These will be located in the `logs/` directory of your Minecraft instance. Please upload them as a gist or directly into this editor.
- Detailed reproduction steps: sometimes I can spot a bug pretty easily, but often it's much more obscure. The more information I have to help reproduce it, the quicker it'll get fixed. - Detailed reproduction steps: sometimes I can spot a bug pretty easily, but often it's much more obscure. The more information I have to help reproduce it, the quicker it'll get fixed.

View File

@@ -10,7 +10,7 @@ do use the issue templates - they provide a useful hint on what information to p
## Developing ## Developing
In order to develop CC: Tweaked, you'll need to download the source code and then run it. This is a pretty simple In order to develop CC: Tweaked, you'll need to download the source code and then run it. This is a pretty simple
process. When building on Windows, Use `gradlew.bat` instead of `./gradlew`. process.
- **Clone the repository:** `git clone https://github.com/SquidDev-CC/CC-Tweaked.git && cd CC-Tweaked` - **Clone the repository:** `git clone https://github.com/SquidDev-CC/CC-Tweaked.git && cd CC-Tweaked`
- **Setup Forge:** `./gradlew build` - **Setup Forge:** `./gradlew build`

View File

@@ -1,4 +1,4 @@
# ![CC: Tweaked](doc/logo.png) # ![CC: Tweaked](logo.png)
[![Current build status](https://github.com/SquidDev-CC/CC-Tweaked/workflows/Build/badge.svg)](https://github.com/SquidDev-CC/CC-Tweaked/actions "Current build status") [![Download CC: Tweaked on CurseForge](http://cf.way2muchnoise.eu/title/cc-tweaked.svg)](https://minecraft.curseforge.com/projects/cc-tweaked "Download CC: Tweaked on CurseForge") [![Current build status](https://github.com/SquidDev-CC/CC-Tweaked/workflows/Build/badge.svg)](https://github.com/SquidDev-CC/CC-Tweaked/actions "Current build status") [![Download CC: Tweaked on CurseForge](http://cf.way2muchnoise.eu/title/cc-tweaked.svg)](https://minecraft.curseforge.com/projects/cc-tweaked "Download CC: Tweaked on CurseForge")
CC: Tweaked is a fork of [ComputerCraft](https://github.com/dan200/ComputerCraft), adding programmable computers, CC: Tweaked is a fork of [ComputerCraft](https://github.com/dan200/ComputerCraft), adding programmable computers,
@@ -50,12 +50,12 @@ I'd generally recommend you don't contact me directly (email, DM, etc...) unless
report exploits). You'll get a far quicker response if you ask the whole community! report exploits). You'll get a far quicker response if you ask the whole community!
## Using ## Using
CC: Tweaked is hosted on my maven repo, and so is relatively simple to depend on. You may wish to add a soft (or hard) If you want to depend on CC: Tweaked, we have a maven repo. However, you should be wary that some functionality is only
dependency in your `mods.toml` file, with the appropriate version bounds, to ensure that API functionality you depend exposed by CC:T's API and not vanilla ComputerCraft. If you wish to support all variations of ComputerCraft, I recommend
on is present. using [cc.crzd.me's maven](https://cc.crzd.me/maven/) instead.
```groovy ```groovy
repositories { dependencies {
maven { url 'https://squiddev.cc/maven/' } maven { url 'https://squiddev.cc/maven/' }
} }

View File

@@ -109,7 +109,7 @@ dependencies {
compileOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.3:api") compileOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.3:api")
compileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.15.2:6.0.0.9") compileOnly fg.deobf("com.blamejared.crafttweaker:CraftTweaker-1.15.2:6.0.0.9")
runtimeOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.3") // runtimeOnly fg.deobf("mezz.jei:jei-1.15.2:6.0.0.3")
compileOnly 'com.google.auto.service:auto-service:1.0-rc7' compileOnly 'com.google.auto.service:auto-service:1.0-rc7'
annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7' annotationProcessor 'com.google.auto.service:auto-service:1.0-rc7'

View File

@@ -1,55 +0,0 @@
--[[-
Global functions defined by `bios.lua`. This does not include standard Lua
functions.
@module _G
]]
--[[- Pauses execution for the specified number of seconds.
As it waits for a fixed amount of world ticks, `time` will automatically be
rounded up to the nearest multiple of 0.05 seconds. If you are using coroutines
or the @{parallel|parallel API}, it will only pause execution of the current
thread, not the whole program.
**Note** Because sleep internally uses timers, it is a function that yields.
This means that you can use it to prevent "Too long without yielding" errors,
however, as the minimum sleep time is 0.05 seconds, it will slow your program
down.
**Warning** Internally, this function queues and waits for a timer event (using
@{os.startTimer}), however it does not listen for any other events. This means
that any event that occurs while sleeping will be entirely discarded. If you
need to receive events while sleeping, consider using @{os.startTimer|timers},
or the @{parallel|parallel API}.
@tparam number time The number of seconds to sleep for, rounded up to the
nearest multiple of 0.05.
@see os.startTimer
]]
function sleep(time) end
function write(text) end
function print(...) end
function printError(...) end
function read(replaceChar, history, completeFn, default) end
--- The ComputerCraft and Minecraft version of the current computer environment.
--
-- For example, `ComputerCraft 1.93.0 (Minecraft 1.15.2)`.
_HOST = _HOST
--[[- The default computer settings as defined in the ComputerCraft
configuration.
This is a comma-separated list of settings pairs defined by the mod
configuration or server owner. By default, it is empty.
An example value to disable autocompletion:
shell.autocomplete=false,lua.autocomplete=false,edit.autocomplete=false
]]
_CC_DEFAULT_SETTINGS = _CC_DEFAULT_SETTINGS

View File

@@ -1,121 +1,6 @@
-- Defined in bios.lua -- Defined in bios.lua
--[[- Loads the given API into the global environment.
**Warning** This function is deprecated. Use of this function will pollute the
global table, use @{require} instead.
This function loads and executes the file at the given path, and all global
variables and functions exported by it will by available through the use of
`myAPI.<function name>`, where `myAPI` is the base name of the API file.
@tparam string path The path of the API to load.
@treturn boolean Whether or not the API was successfully loaded.
@deprecated Use @{require}.
]]
function loadAPI(path) end function loadAPI(path) end
--- Unloads an API which was loaded by @{os.loadAPI}.
--
-- This effectively removes the specified table from `_G`.
--
-- @tparam string name The name of the API to unload.
-- @deprecated Use @{require}.
function unloadAPI(name) end
--[[- Pause execution of the current thread and waits for any events matching
`filter`.
This function @{coroutine.yield|yields} the current process and waits for it
to be resumed with a vararg list where the first element matches `filter`.
If no `filter` is supplied, this will match all events.
Unlike @{os.pullEventRaw}, it will stop the application upon a "terminate"
event, printing the error "Terminated".
@tparam[opt] string filter Event to filter for.
@treturn string event The name of the event that fired.
@treturn any param... Optional additional parameters of the event.
@usage Listen for `mouse_click` events.
while true do
local event, button, x, y = os.pullEvent("mouse_click")
print("Button", button, "was clicked at", x, ",", y)
end
@usage Listen for multiple events.
while true do
local eventData = {os.pullEvent()}
local event = eventData[1]
if event == "mouse_click" then
print("Button", eventData[2], "was clicked at", eventData[3], ",", eventData[4])
elseif event == "key" then
print("Key code", eventData[2], "was pressed")
end
end
@see os.pullEventRaw To pull the terminate event.
]]
function pullEvent(filter) end function pullEvent(filter) end
--[[- Pause execution of the current thread and waits for events, including the
`terminate` event.
This behaves almost the same as @{os.pullEvent}, except it allows you to handle
the `terminate` event yourself - the program will not stop execution when
<kbd>Ctrl+T</kbd> is pressed.
@tparam[opt] string filter Event to filter for.
@treturn string event The name of the event that fired.
@treturn any param... Optional additional parameters of the event.
@usage Listen for `terminate` events.
while true do
local event = os.pullEventRaw()
if event == "terminate" then
print("Caught terminate event!")
end
end
@see os.pullEvent To pull events normally.
]]
function pullEventRaw(filter) end function pullEventRaw(filter) end
--- Pauses execution for the specified number of seconds, alias of @{_G.sleep}.
function sleep(time) end
--- Get the current CraftOS version (for example, `CraftOS 1.8`).
--
-- This is defined by `bios.lua`. For the current version of CC:Tweaked, this
-- should return `CraftOS 1.8`.
--
-- @treturn string The current CraftOS version.
function version() end function version() end
--[[- Run the program at the given path with the specified environment and
arguments.
This function does not resolve program names like the shell does. This means
that, for example, `os.run("edit")` will not work. As well as this, it does not
provide access to the @{shell} API in the environment. For this behaviour, use
@{shell.run} instead.
If the program cannot be found, or failed to run, it will print the error and
return `false`. If you want to handle this more gracefully, use an alternative
such as @{loadfile}.
@tparam table env The environment to run the program with.
@tparam string path The exact path of the program to run.
@param ... The arguments to pass to the program.
@treturn boolean Whether or not the program ran successfully.
@usage Run the default shell from within your program:
os.run({}, "/rom/programs/shell")
@see shell.run
@see loadfile
]]
function run(env, path, ...) end function run(env, path, ...) end

View File

@@ -23,7 +23,7 @@ body {
"Droid Sans", "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; "Droid Sans", "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
} }
code, pre, kbd, .parameter, .type, .definition-name, .reference-code { code, pre, .parameter, .type, .definition-name, .reference-code {
font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace; font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, Courier, monospace;
} }
@@ -111,7 +111,7 @@ footer {
} }
/* The definition lists at the top of each page */ /* The definition lists at the top of each page */
table.definition-list, table.pretty-table { table.definition-list {
border-collapse: collapse; border-collapse: collapse;
width: 100%; width: 100%;
} }
@@ -128,23 +128,8 @@ table.definition-list th {
text-align: right; text-align: right;
} }
/* Deprecated definitions */
table.definition-list tr.definition-deprecated th {
text-decoration: line-through;
}
table.definition-list td { width: 100%; } table.definition-list td { width: 100%; }
/* Pretty tables, mostly inherited from table.definition-list */
table.pretty-table td, table.pretty-table th {
border: 1px solid #cccccc;
padding: 2px 4px;
}
table.pretty-table th {
background-color: #f0f0f0;
}
dl.definition dt { dl.definition dt {
border-top: 1px solid #ccc; border-top: 1px solid #ccc;
padding-top: 1em; padding-top: 1em;
@@ -157,10 +142,6 @@ dl.definition dt .definition-name {
flex-grow: 1; flex-grow: 1;
} }
/* Deprecated definitions */
dl.definition dt .definition-name.definition-deprecated {
text-decoration: line-through;
}
dl.definition dd { dl.definition dd {
padding-bottom: 1em; padding-bottom: 1em;
@@ -192,20 +173,6 @@ span.parameter:after { content:":"; padding-left: 0.3em; }
vertical-align: middle; vertical-align: middle;
} }
/** Fancy keyboard shortcut styling, inspired by GitHub markdown. */
kbd {
display: inline-block;
padding: 4px 5px;
font-size: 0.8em;
line-height: 10px;
color: #444d56;
vertical-align: middle;
background-color: #fafbfc;
border: 1px solid #d1d5da;
border-radius: 3px;
box-shadow: inset 0 -1px 0 #d1d5da;
}
/* styles for prettification of source */ /* styles for prettification of source */
.highlight .comment { color: #558817; } .highlight .comment { color: #558817; }
.highlight .constant { color: #a8660d; } .highlight .constant { color: #a8660d; }

View File

@@ -1,7 +1,7 @@
# Mod properties # Mod properties
mod_version=1.93.1 mod_version=1.90.0
# Minecraft properties (update mods.toml when changing) # Minecraft properties (update mods.toml when changing)
mc_version=1.15.2 mc_version=1.16.1
forge_version=31.1.41 forge_version=32.0.63
mappings_version=20200429-1.15.1 mappings_version=20200707-1.16.1

View File

@@ -50,7 +50,7 @@
;; colours imports from colors, and we don't handle that right now. ;; colours imports from colors, and we don't handle that right now.
;; keys is entirely dynamic, so we skip it. ;; keys is entirely dynamic, so we skip it.
(dynamic-modules colours keys _G) (dynamic-modules colours keys)
(globals (globals
:max :max
@@ -79,7 +79,6 @@
/doc/stub/http.lua /doc/stub/http.lua
/doc/stub/os.lua /doc/stub/os.lua
/doc/stub/turtle.lua /doc/stub/turtle.lua
/doc/stub/global.lua
; Java generated APIs ; Java generated APIs
/doc/javadoc/turtle.lua /doc/javadoc/turtle.lua
; Peripherals ; Peripherals
@@ -101,14 +100,7 @@
/doc/stub/fs.lua) /doc/stub/fs.lua)
(linters -doc:unresolved-reference)) (linters -doc:unresolved-reference))
;; Suppress warnings for the BIOS using its own deprecated members for now.
(at /src/main/resources/*/computercraft/lua/bios.lua
(linters -var:deprecated))
(at /src/test/resources/test-rom (at /src/test/resources/test-rom
; We should still be able to test deprecated members.
(linters -var:deprecated)
(lint (lint
(globals (globals
:max sleep write :max sleep write

View File

@@ -0,0 +1,10 @@
{
"replace": false,
"values": [
"computercraft:computer_advanced",
"computercraft:turtle_advanced",
"computercraft:wireless_modem_advanced",
"computercraft:pocket_computer_advanced",
"computercraft:monitor_advanced"
]
}

View File

@@ -8,7 +8,6 @@ package dan200.computercraft;
import dan200.computercraft.api.turtle.event.TurtleAction; import dan200.computercraft.api.turtle.event.TurtleAction;
import dan200.computercraft.core.apis.http.options.Action; import dan200.computercraft.core.apis.http.options.Action;
import dan200.computercraft.core.apis.http.options.AddressRule; import dan200.computercraft.core.apis.http.options.AddressRule;
import dan200.computercraft.core.asm.GenericSource;
import dan200.computercraft.shared.Config; import dan200.computercraft.shared.Config;
import dan200.computercraft.shared.Registry; import dan200.computercraft.shared.Registry;
import dan200.computercraft.shared.computer.core.ClientComputerRegistry; import dan200.computercraft.shared.computer.core.ClientComputerRegistry;
@@ -17,7 +16,6 @@ import dan200.computercraft.shared.peripheral.monitor.MonitorRenderer;
import dan200.computercraft.shared.pocket.peripherals.PocketModem; import dan200.computercraft.shared.pocket.peripherals.PocketModem;
import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker; import dan200.computercraft.shared.pocket.peripherals.PocketSpeaker;
import dan200.computercraft.shared.turtle.upgrades.*; import dan200.computercraft.shared.turtle.upgrades.*;
import dan200.computercraft.shared.util.ServiceUtil;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@@ -39,7 +37,6 @@ public final class ComputerCraft
public static final String[] DEFAULT_HTTP_ALLOW = new String[] { "*" }; public static final String[] DEFAULT_HTTP_ALLOW = new String[] { "*" };
public static final String[] DEFAULT_HTTP_DENY = new String[] { public static final String[] DEFAULT_HTTP_DENY = new String[] {
"127.0.0.0/8", "127.0.0.0/8",
"0.0.0.0/8",
"10.0.0.0/8", "10.0.0.0/8",
"172.16.0.0/12", "172.16.0.0/12",
"192.168.0.0/16", "192.168.0.0/16",
@@ -63,10 +60,10 @@ public final class ComputerCraft
public static boolean httpWebsocketEnabled = true; public static boolean httpWebsocketEnabled = true;
public static List<AddressRule> httpRules = Collections.unmodifiableList( Stream.concat( public static List<AddressRule> httpRules = Collections.unmodifiableList( Stream.concat(
Stream.of( DEFAULT_HTTP_DENY ) Stream.of( DEFAULT_HTTP_DENY )
.map( x -> AddressRule.parse( x, null, Action.DENY.toPartial() ) ) .map( x -> AddressRule.parse( x, Action.DENY.toPartial() ) )
.filter( Objects::nonNull ), .filter( Objects::nonNull ),
Stream.of( DEFAULT_HTTP_ALLOW ) Stream.of( DEFAULT_HTTP_ALLOW )
.map( x -> AddressRule.parse( x, null, Action.ALLOW.toPartial() ) ) .map( x -> AddressRule.parse( x, Action.ALLOW.toPartial() ) )
.filter( Objects::nonNull ) .filter( Objects::nonNull )
).collect( Collectors.toList() ) ); ).collect( Collectors.toList() ) );
@@ -136,6 +133,5 @@ public final class ComputerCraft
{ {
Config.setup(); Config.setup();
Registry.setup(); Registry.setup();
GenericSource.setup( () -> ServiceUtil.loadServicesForge( GenericSource.class ) );
} }
} }

View File

@@ -54,7 +54,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
public static InputStream getResourceFile( String domain, String subPath ) public static InputStream getResourceFile( String domain, String subPath )
{ {
IReloadableResourceManager manager = ServerLifecycleHooks.getCurrentServer().getResourceManager(); IReloadableResourceManager manager = (IReloadableResourceManager) ServerLifecycleHooks.getCurrentServer().getDataPackRegistries().func_240970_h_();
try try
{ {
return manager.getResource( new ResourceLocation( domain, subPath ) ).getInputStream(); return manager.getResource( new ResourceLocation( domain, subPath ) ).getInputStream();
@@ -97,7 +97,7 @@ public final class ComputerCraftAPIImpl implements IComputerCraftAPI
@Override @Override
public IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath ) public IMount createResourceMount( @Nonnull String domain, @Nonnull String subPath )
{ {
IReloadableResourceManager manager = ServerLifecycleHooks.getCurrentServer().getResourceManager(); IReloadableResourceManager manager = (IReloadableResourceManager) ServerLifecycleHooks.getCurrentServer().getDataPackRegistries().func_240970_h_();
ResourceMount mount = ResourceMount.get( domain, subPath, manager ); ResourceMount mount = ResourceMount.get( domain, subPath, manager );
return mount.exists( "" ) ? mount : null; return mount.exists( "" ) ? mount : null;
} }

View File

@@ -6,11 +6,11 @@
package dan200.computercraft.api.client; package dan200.computercraft.api.client;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.model.ModelManager; import net.minecraft.client.renderer.model.ModelManager;
import net.minecraft.client.renderer.model.ModelResourceLocation; import net.minecraft.client.renderer.model.ModelResourceLocation;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.math.vector.TransformationMatrix;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.Objects; import java.util.Objects;

View File

@@ -5,7 +5,7 @@
*/ */
package dan200.computercraft.api.network; package dan200.computercraft.api.network;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -29,7 +29,7 @@ public interface IPacketReceiver
* @return The receiver's position. * @return The receiver's position.
*/ */
@Nonnull @Nonnull
Vec3d getPosition(); Vector3d getPosition();
/** /**
* Get the maximum distance this receiver can send and receive messages. * Get the maximum distance this receiver can send and receive messages.

View File

@@ -5,7 +5,7 @@
*/ */
package dan200.computercraft.api.network; package dan200.computercraft.api.network;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -29,7 +29,7 @@ public interface IPacketSender
* @return The sender's position. * @return The sender's position.
*/ */
@Nonnull @Nonnull
Vec3d getPosition(); Vector3d getPosition();
/** /**
* Get some sort of identification string for this sender. This does not strictly need to be unique, but you * Get some sort of identification string for this sender. This does not strictly need to be unique, but you

View File

@@ -13,7 +13,7 @@ import net.minecraft.inventory.IInventory;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.IItemHandlerModifiable;
@@ -67,7 +67,7 @@ public interface ITurtleAccess
* @see #getVisualYaw(float) * @see #getVisualYaw(float)
*/ */
@Nonnull @Nonnull
Vec3d getVisualPosition( float f ); Vector3d getVisualPosition( float f );
/** /**
* Returns the yaw the turtle is facing when it is rendered. * Returns the yaw the turtle is facing when it is rendered.

View File

@@ -12,14 +12,12 @@ import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.gui.NewChatGui; import net.minecraft.client.gui.NewChatGui;
import net.minecraft.client.gui.RenderComponentsUtil;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.List;
public class ClientTableFormatter implements TableFormatter public class ClientTableFormatter implements TableFormatter
{ {
@@ -57,7 +55,7 @@ public class ClientTableFormatter implements TableFormatter
@Override @Override
public int getWidth( ITextComponent component ) public int getWidth( ITextComponent component )
{ {
return renderer().getStringWidth( component.getFormattedText() ); return renderer().func_238414_a_( component );
} }
@Override @Override
@@ -66,10 +64,11 @@ public class ClientTableFormatter implements TableFormatter
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
NewChatGui chat = mc.ingameGUI.getChatGUI(); NewChatGui chat = mc.ingameGUI.getChatGUI();
// Trim the text if it goes over the allowed length // TODO: Trim the text if it goes over the allowed length
int maxWidth = MathHelper.floor( chat.getChatWidth() / chat.getScale() ); // int maxWidth = MathHelper.floor( chat.getChatWidth() / chat.getScale() );
List<ITextComponent> list = RenderComponentsUtil.splitText( component, maxWidth, mc.fontRenderer, false, false ); // List<ITextProperties> list = RenderComponentsUtil.func_238505_a_( component, maxWidth, mc.fontRenderer );
if( !list.isEmpty() ) chat.printChatMessageWithOptionalDeletion( list.get( 0 ), id ); // if( !list.isEmpty() ) chat.printChatMessageWithOptionalDeletion( list.get( 0 ), id );
chat.printChatMessageWithOptionalDeletion( component, id );
} }
@Override @Override

View File

@@ -13,10 +13,14 @@ import dan200.computercraft.core.terminal.TextBuffer;
import dan200.computercraft.shared.util.Colour; import dan200.computercraft.shared.util.Colour;
import dan200.computercraft.shared.util.Palette; import dan200.computercraft.shared.util.Palette;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.RenderState;
import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexFormat; import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.math.vector.TransformationMatrix;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;

View File

@@ -5,6 +5,7 @@
*/ */
package dan200.computercraft.client.gui; package dan200.computercraft.client.gui;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.client.gui.widgets.WidgetTerminal; import dan200.computercraft.client.gui.widgets.WidgetTerminal;
@@ -21,6 +22,8 @@ import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import javax.annotation.Nonnull;
import static dan200.computercraft.client.render.ComputerBorderRenderer.BORDER; import static dan200.computercraft.client.render.ComputerBorderRenderer.BORDER;
import static dan200.computercraft.client.render.ComputerBorderRenderer.MARGIN; import static dan200.computercraft.client.render.ComputerBorderRenderer.MARGIN;
@@ -120,7 +123,7 @@ public final class GuiComputer<T extends ContainerComputerBase> extends Containe
} }
@Override @Override
public void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY ) public void func_230450_a_( @Nonnull MatrixStack stack, float partialTicks, int mouseX, int mouseY )
{ {
// Draw terminal // Draw terminal
terminal.draw( terminalWrapper.getX(), terminalWrapper.getY() ); terminal.draw( terminalWrapper.getX(), terminalWrapper.getY() );
@@ -135,11 +138,10 @@ public final class GuiComputer<T extends ContainerComputerBase> extends Containe
} }
@Override @Override
public void render( int mouseX, int mouseY, float partialTicks ) public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks )
{ {
renderBackground(); super.render( stack, mouseX, mouseY, partialTicks );
super.render( mouseX, mouseY, partialTicks ); func_230459_a_( stack, mouseX, mouseY );
renderHoveredToolTip( mouseX, mouseY );
} }
@Override @Override
@@ -148,4 +150,10 @@ public final class GuiComputer<T extends ContainerComputerBase> extends Containe
return (getFocused() != null && getFocused().mouseDragged( x, y, button, deltaX, deltaY )) return (getFocused() != null && getFocused().mouseDragged( x, y, button, deltaX, deltaY ))
|| super.mouseDragged( x, y, button, deltaX, deltaY ); || super.mouseDragged( x, y, button, deltaX, deltaY );
} }
@Override
protected void func_230451_b_( @Nonnull MatrixStack transform, int mouseX, int mouseY )
{
// Skip rendering labels.
}
} }

View File

@@ -5,6 +5,7 @@
*/ */
package dan200.computercraft.client.gui; package dan200.computercraft.client.gui;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.shared.peripheral.diskdrive.ContainerDiskDrive; import dan200.computercraft.shared.peripheral.diskdrive.ContainerDiskDrive;
import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.gui.screen.inventory.ContainerScreen;
@@ -12,6 +13,8 @@ import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import javax.annotation.Nonnull;
public class GuiDiskDrive extends ContainerScreen<ContainerDiskDrive> public class GuiDiskDrive extends ContainerScreen<ContainerDiskDrive>
{ {
private static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/disk_drive.png" ); private static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/disk_drive.png" );
@@ -22,26 +25,18 @@ public class GuiDiskDrive extends ContainerScreen<ContainerDiskDrive>
} }
@Override @Override
protected void drawGuiContainerForegroundLayer( int mouseX, int mouseY ) protected void func_230450_a_( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY )
{
String title = this.title.getFormattedText();
font.drawString( title, (xSize - font.getStringWidth( title )) / 2.0f, 6, 0x404040 );
font.drawString( title, 8, ySize - 96 + 2, 0x404040 );
}
@Override
protected void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY )
{ {
RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F ); RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
minecraft.getTextureManager().bindTexture( BACKGROUND ); minecraft.getTextureManager().bindTexture( BACKGROUND );
blit( guiLeft, guiTop, 0, 0, xSize, ySize ); blit( transform, guiLeft, guiTop, 0, 0, xSize, ySize );
} }
@Override @Override
public void render( int mouseX, int mouseY, float partialTicks ) public void render( @Nonnull MatrixStack transform, int mouseX, int mouseY, float partialTicks )
{ {
renderBackground(); renderBackground( transform );
super.render( mouseX, mouseY, partialTicks ); super.render( transform, mouseX, mouseY, partialTicks );
renderHoveredToolTip( mouseX, mouseY ); func_230459_a_( transform, mouseX, mouseY );
} }
} }

View File

@@ -5,14 +5,16 @@
*/ */
package dan200.computercraft.client.gui; package dan200.computercraft.client.gui;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.shared.peripheral.printer.ContainerPrinter; import dan200.computercraft.shared.peripheral.printer.ContainerPrinter;
import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import javax.annotation.Nonnull;
public class GuiPrinter extends ContainerScreen<ContainerPrinter> public class GuiPrinter extends ContainerScreen<ContainerPrinter>
{ {
private static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/printer.png" ); private static final ResourceLocation BACKGROUND = new ResourceLocation( "computercraft", "textures/gui/printer.png" );
@@ -22,29 +24,29 @@ public class GuiPrinter extends ContainerScreen<ContainerPrinter>
super( container, player, title ); super( container, player, title );
} }
@Override /*@Override
protected void drawGuiContainerForegroundLayer( int mouseX, int mouseY ) protected void drawGuiContainerForegroundLayer( int mouseX, int mouseY )
{ {
String title = getTitle().getFormattedText(); String title = getTitle().getFormattedText();
font.drawString( title, (xSize - font.getStringWidth( title )) / 2.0f, 6, 0x404040 ); font.drawString( title, (xSize - font.getStringWidth( title )) / 2.0f, 6, 0x404040 );
font.drawString( I18n.format( "container.inventory" ), 8, ySize - 96 + 2, 0x404040 ); font.drawString( I18n.format( "container.inventory" ), 8, ySize - 96 + 2, 0x404040 );
} }*/
@Override @Override
protected void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY ) protected void func_230450_a_( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY )
{ {
RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F ); RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
minecraft.getTextureManager().bindTexture( BACKGROUND ); minecraft.getTextureManager().bindTexture( BACKGROUND );
blit( guiLeft, guiTop, 0, 0, xSize, ySize ); blit( transform, guiLeft, guiTop, 0, 0, xSize, ySize );
if( getContainer().isPrinting() ) blit( guiLeft + 34, guiTop + 21, 176, 0, 25, 45 ); if( getContainer().isPrinting() ) blit( transform, guiLeft + 34, guiTop + 21, 176, 0, 25, 45 );
} }
@Override @Override
public void render( int mouseX, int mouseY, float partialTicks ) public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks )
{ {
renderBackground(); renderBackground( stack );
super.render( mouseX, mouseY, partialTicks ); super.render( stack, mouseX, mouseY, partialTicks );
renderHoveredToolTip( mouseX, mouseY ); func_230459_a_( stack, mouseX, mouseY );
} }
} }

View File

@@ -5,6 +5,7 @@
*/ */
package dan200.computercraft.client.gui; package dan200.computercraft.client.gui;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.core.terminal.TextBuffer; import dan200.computercraft.core.terminal.TextBuffer;
import dan200.computercraft.shared.common.ContainerHeldItem; import dan200.computercraft.shared.common.ContainerHeldItem;
@@ -12,12 +13,14 @@ import dan200.computercraft.shared.media.items.ItemPrintout;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.inventory.ContainerScreen; import net.minecraft.client.gui.screen.inventory.ContainerScreen;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.entity.player.PlayerInventory; import net.minecraft.entity.player.PlayerInventory;
import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.math.vector.TransformationMatrix;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import javax.annotation.Nonnull;
import static dan200.computercraft.client.render.PrintoutRenderer.*; import static dan200.computercraft.client.render.PrintoutRenderer.*;
public class GuiPrintout extends ContainerScreen<ContainerHeldItem> public class GuiPrintout extends ContainerScreen<ContainerHeldItem>
@@ -91,27 +94,34 @@ public class GuiPrintout extends ContainerScreen<ContainerHeldItem>
} }
@Override @Override
public void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY ) protected void func_230450_a_( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY )
{ {
// Draw the printout // Draw the printout
RenderSystem.color4f( 1.0f, 1.0f, 1.0f, 1.0f ); RenderSystem.color4f( 1.0f, 1.0f, 1.0f, 1.0f );
RenderSystem.enableDepthTest(); RenderSystem.enableDepthTest();
IRenderTypeBuffer.Impl renderer = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource(); IRenderTypeBuffer.Impl renderer = Minecraft.getInstance().getRenderTypeBuffers().getBufferSource();
drawBorder( IDENTITY, renderer, guiLeft, guiTop, getBlitOffset(), m_page, m_pages, m_book ); Matrix4f matrix = transform.getLast().getMatrix();
drawText( IDENTITY, renderer, guiLeft + X_TEXT_MARGIN, guiTop + Y_TEXT_MARGIN, ItemPrintout.LINES_PER_PAGE * m_page, m_text, m_colours ); drawBorder( matrix, renderer, guiLeft, guiTop, getBlitOffset(), m_page, m_pages, m_book );
drawText( matrix, renderer, guiLeft + X_TEXT_MARGIN, guiTop + Y_TEXT_MARGIN, ItemPrintout.LINES_PER_PAGE * m_page, m_text, m_colours );
renderer.finish(); renderer.finish();
} }
@Override @Override
public void render( int mouseX, int mouseY, float partialTicks ) public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks )
{ {
// We must take the background further back in order to not overlap with our printed pages. // We must take the background further back in order to not overlap with our printed pages.
setBlitOffset( getBlitOffset() - 1 ); setBlitOffset( getBlitOffset() - 1 );
renderBackground(); renderBackground( stack );
setBlitOffset( getBlitOffset() + 1 ); setBlitOffset( getBlitOffset() + 1 );
super.render( mouseX, mouseY, partialTicks ); super.render( stack, mouseX, mouseY, partialTicks );
renderHoveredToolTip( mouseX, mouseY ); func_230459_a_( stack, mouseX, mouseY );
}
@Override
protected void func_230451_b_( @Nonnull MatrixStack transform, int mouseX, int mouseY )
{
// Skip rendering labels.
} }
} }

View File

@@ -5,6 +5,7 @@
*/ */
package dan200.computercraft.client.gui; package dan200.computercraft.client.gui;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.client.gui.widgets.WidgetTerminal; import dan200.computercraft.client.gui.widgets.WidgetTerminal;
@@ -18,6 +19,8 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import org.lwjgl.glfw.GLFW; import org.lwjgl.glfw.GLFW;
import javax.annotation.Nonnull;
public class GuiTurtle extends ContainerScreen<ContainerTurtle> public class GuiTurtle extends ContainerScreen<ContainerTurtle>
{ {
private static final ResourceLocation BACKGROUND_NORMAL = new ResourceLocation( "computercraft", "textures/gui/turtle_normal.png" ); private static final ResourceLocation BACKGROUND_NORMAL = new ResourceLocation( "computercraft", "textures/gui/turtle_normal.png" );
@@ -102,12 +105,12 @@ public class GuiTurtle extends ContainerScreen<ContainerTurtle>
int slotX = slot % 4; int slotX = slot % 4;
int slotY = slot / 4; int slotY = slot / 4;
minecraft.getTextureManager().bindTexture( advanced ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL ); minecraft.getTextureManager().bindTexture( advanced ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL );
blit( guiLeft + ContainerTurtle.TURTLE_START_X - 2 + slotX * 18, guiTop + ContainerTurtle.PLAYER_START_Y - 2 + slotY * 18, 0, 217, 24, 24 ); // TODO: blit( guiLeft + ContainerTurtle.TURTLE_START_X - 2 + slotX * 18, guiTop + ContainerTurtle.PLAYER_START_Y - 2 + slotY * 18, 0, 217, 24, 24 );
} }
} }
@Override @Override
protected void drawGuiContainerBackgroundLayer( float partialTicks, int mouseX, int mouseY ) protected void func_230450_a_( @Nonnull MatrixStack transform, float partialTicks, int mouseX, int mouseY )
{ {
// Draw term // Draw term
boolean advanced = m_family == ComputerFamily.ADVANCED; boolean advanced = m_family == ComputerFamily.ADVANCED;
@@ -116,17 +119,17 @@ public class GuiTurtle extends ContainerScreen<ContainerTurtle>
// Draw border/inventory // Draw border/inventory
RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F ); RenderSystem.color4f( 1.0F, 1.0F, 1.0F, 1.0F );
minecraft.getTextureManager().bindTexture( advanced ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL ); minecraft.getTextureManager().bindTexture( advanced ? BACKGROUND_ADVANCED : BACKGROUND_NORMAL );
blit( guiLeft, guiTop, 0, 0, xSize, ySize ); blit( transform, guiLeft, guiTop, 0, 0, xSize, ySize );
drawSelectionSlot( advanced ); drawSelectionSlot( advanced );
} }
@Override @Override
public void render( int mouseX, int mouseY, float partialTicks ) public void render( @Nonnull MatrixStack stack, int mouseX, int mouseY, float partialTicks )
{ {
renderBackground(); renderBackground( stack );
super.render( mouseX, mouseY, partialTicks ); super.render( stack, mouseX, mouseY, partialTicks );
renderHoveredToolTip( mouseX, mouseY ); func_230459_a_( stack, mouseX, mouseY );
} }
@Override @Override
@@ -135,4 +138,10 @@ public class GuiTurtle extends ContainerScreen<ContainerTurtle>
return (getFocused() != null && getFocused().mouseDragged( x, y, button, deltaX, deltaY )) return (getFocused() != null && getFocused().mouseDragged( x, y, button, deltaX, deltaY ))
|| super.mouseDragged( x, y, button, deltaX, deltaY ); || super.mouseDragged( x, y, button, deltaX, deltaY );
} }
@Override
protected void func_230451_b_( @Nonnull MatrixStack transform, int mouseX, int mouseY )
{
// Skip rendering labels.
}
} }

View File

@@ -11,13 +11,19 @@ import dan200.computercraft.client.render.TileEntityMonitorRenderer;
import dan200.computercraft.client.render.TileEntityTurtleRenderer; import dan200.computercraft.client.render.TileEntityTurtleRenderer;
import dan200.computercraft.client.render.TurtlePlayerRenderer; import dan200.computercraft.client.render.TurtlePlayerRenderer;
import dan200.computercraft.shared.Registry; import dan200.computercraft.shared.Registry;
import dan200.computercraft.shared.common.IColouredItem;
import dan200.computercraft.shared.computer.inventory.ContainerComputer; import dan200.computercraft.shared.computer.inventory.ContainerComputer;
import dan200.computercraft.shared.computer.inventory.ContainerViewComputer; import dan200.computercraft.shared.computer.inventory.ContainerViewComputer;
import dan200.computercraft.shared.peripheral.monitor.ClientMonitor; import dan200.computercraft.shared.peripheral.monitor.ClientMonitor;
import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer; import dan200.computercraft.shared.pocket.inventory.ContainerPocketComputer;
import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
import net.minecraft.client.gui.ScreenManager; import net.minecraft.client.gui.ScreenManager;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.RenderTypeLookup; import net.minecraft.client.renderer.RenderTypeLookup;
import net.minecraft.item.IItemPropertyGetter;
import net.minecraft.item.Item;
import net.minecraft.item.ItemModelsProperties;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.event.world.WorldEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
@@ -26,6 +32,8 @@ import net.minecraftforge.fml.client.registry.RenderingRegistry;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent; import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import java.util.function.Supplier;
@Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD ) @Mod.EventBusSubscriber( modid = ComputerCraft.MOD_ID, value = Dist.CLIENT, bus = Mod.EventBusSubscriber.Bus.MOD )
public final class ComputerCraftProxyClient public final class ComputerCraftProxyClient
{ {
@@ -50,6 +58,25 @@ public final class ComputerCraftProxyClient
// TODO: ClientRegistry.bindTileEntityRenderer( TileCable.FACTORY, x -> new TileEntityCableRenderer() ); // TODO: ClientRegistry.bindTileEntityRenderer( TileCable.FACTORY, x -> new TileEntityCableRenderer() );
RenderingRegistry.registerEntityRenderingHandler( Registry.ModEntities.TURTLE_PLAYER.get(), TurtlePlayerRenderer::new ); RenderingRegistry.registerEntityRenderingHandler( Registry.ModEntities.TURTLE_PLAYER.get(), TurtlePlayerRenderer::new );
registerItemProperty( "state",
( stack, world, player ) -> ItemPocketComputer.getState( stack ).ordinal(),
Registry.ModItems.POCKET_COMPUTER_NORMAL, Registry.ModItems.POCKET_COMPUTER_ADVANCED
);
registerItemProperty( "state",
( stack, world, player ) -> IColouredItem.getColourBasic( stack ) != -1 ? 1 : 0,
Registry.ModItems.POCKET_COMPUTER_NORMAL, Registry.ModItems.POCKET_COMPUTER_ADVANCED
);
}
@SafeVarargs
private static void registerItemProperty( String name, IItemPropertyGetter getter, Supplier<? extends Item>... items )
{
ResourceLocation id = new ResourceLocation( ComputerCraft.MOD_ID, name );
for( Supplier<? extends Item> item : items )
{
ItemModelsProperties.func_239418_a_( item.get(), id, getter );
}
} }
private static void registerContainers() private static void registerContainers()

View File

@@ -14,14 +14,14 @@ import dan200.computercraft.shared.peripheral.modem.wired.CableShapes;
import dan200.computercraft.shared.util.WorldUtil; import dan200.computercraft.shared.util.WorldUtil;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.ActiveRenderInfo;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.WorldRenderer; import net.minecraft.client.renderer.WorldRenderer;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.shapes.VoxelShape; import net.minecraft.util.math.shapes.VoxelShape;
import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.DrawHighlightEvent; import net.minecraftforge.client.event.DrawHighlightEvent;
@@ -63,7 +63,7 @@ public final class CableHighlightRenderer
? CableShapes.getModemShape( state ) ? CableShapes.getModemShape( state )
: CableShapes.getCableShape( state ); : CableShapes.getCableShape( state );
Vec3d cameraPos = info.getProjectedView(); Vector3d cameraPos = info.getProjectedView();
double xOffset = pos.getX() - cameraPos.getX(); double xOffset = pos.getX() - cameraPos.getX();
double yOffset = pos.getY() - cameraPos.getY(); double yOffset = pos.getY() - cameraPos.getY();
double zOffset = pos.getZ() - cameraPos.getZ(); double zOffset = pos.getZ() - cameraPos.getZ();

View File

@@ -11,10 +11,10 @@ import com.mojang.blaze3d.vertex.IVertexBuilder;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.computer.core.ComputerFamily; import dan200.computercraft.shared.computer.core.ComputerFamily;
import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.vector.Matrix4f;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;

View File

@@ -10,12 +10,12 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity; import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.renderer.FirstPersonRenderer; import net.minecraft.client.renderer.FirstPersonRenderer;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.HandSide; import net.minecraft.util.HandSide;
import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector3f;
public abstract class ItemMapLikeRenderer public abstract class ItemMapLikeRenderer
{ {

View File

@@ -15,9 +15,13 @@ import dan200.computercraft.shared.computer.core.ComputerFamily;
import dan200.computercraft.shared.pocket.items.ItemPocketComputer; import dan200.computercraft.shared.pocket.items.ItemPocketComputer;
import dan200.computercraft.shared.util.Colour; import dan200.computercraft.shared.util.Colour;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.math.vector.Vector3f;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;

View File

@@ -9,9 +9,9 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.media.items.ItemPrintout; import dan200.computercraft.shared.media.items.ItemPrintout;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.math.vector.Vector3f;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RenderHandEvent; import net.minecraftforge.client.event.RenderHandEvent;
import net.minecraftforge.client.event.RenderItemInFrameEvent; import net.minecraftforge.client.event.RenderItemInFrameEvent;

View File

@@ -9,12 +9,12 @@ import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder; import com.mojang.blaze3d.vertex.IVertexBuilder;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.peripheral.monitor.TileMonitor; import dan200.computercraft.shared.peripheral.monitor.TileMonitor;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.DrawHighlightEvent; import net.minecraftforge.client.event.DrawHighlightEvent;
@@ -61,7 +61,7 @@ public final class MonitorHighlightRenderer
if( monitor.getYIndex() != monitor.getHeight() - 1 ) faces.remove( monitor.getDown() ); if( monitor.getYIndex() != monitor.getHeight() - 1 ) faces.remove( monitor.getDown() );
MatrixStack transformStack = event.getMatrix(); MatrixStack transformStack = event.getMatrix();
Vec3d cameraPos = event.getInfo().getProjectedView(); Vector3d cameraPos = event.getInfo().getProjectedView();
transformStack.push(); transformStack.push();
transformStack.translate( pos.getX() - cameraPos.getX(), pos.getY() - cameraPos.getY(), pos.getZ() - cameraPos.getZ() ); transformStack.translate( pos.getX() - cameraPos.getX(), pos.getY() - cameraPos.getY(), pos.getZ() - cameraPos.getZ() );

View File

@@ -12,8 +12,8 @@ import com.mojang.blaze3d.systems.RenderSystem;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.client.gui.FixedWidthFontRenderer; import dan200.computercraft.client.gui.FixedWidthFontRenderer;
import dan200.computercraft.shared.util.Palette; import dan200.computercraft.shared.util.Palette;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.texture.TextureUtil; import net.minecraft.client.renderer.texture.TextureUtil;
import net.minecraft.util.math.vector.Matrix4f;
import org.lwjgl.BufferUtils; import org.lwjgl.BufferUtils;
import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL13;
import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL20;

View File

@@ -10,11 +10,11 @@ import dan200.computercraft.client.gui.FixedWidthFontRenderer;
import dan200.computercraft.core.terminal.TextBuffer; import dan200.computercraft.core.terminal.TextBuffer;
import dan200.computercraft.shared.util.Palette; import dan200.computercraft.shared.util.Palette;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.RenderState; import net.minecraft.client.renderer.RenderState;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.vector.Matrix4f;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_HEIGHT; import static dan200.computercraft.client.gui.FixedWidthFontRenderer.FONT_HEIGHT;

View File

@@ -17,13 +17,19 @@ import dan200.computercraft.shared.peripheral.monitor.MonitorRenderer;
import dan200.computercraft.shared.peripheral.monitor.TileMonitor; import dan200.computercraft.shared.peripheral.monitor.TileMonitor;
import dan200.computercraft.shared.util.Colour; import dan200.computercraft.shared.util.Colour;
import dan200.computercraft.shared.util.DirectionUtil; import dan200.computercraft.shared.util.DirectionUtil;
import net.minecraft.client.renderer.*; import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.GLAllocation;
import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Tessellator;
import net.minecraft.client.renderer.tileentity.TileEntityRenderer; import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher; import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats; import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexBuffer; import net.minecraft.client.renderer.vertex.VertexBuffer;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.math.vector.TransformationMatrix;
import net.minecraft.util.math.vector.Vector3f;
import org.lwjgl.opengl.GL11; import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL13; import org.lwjgl.opengl.GL13;
import org.lwjgl.opengl.GL20; import org.lwjgl.opengl.GL20;

View File

@@ -19,8 +19,6 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.Atlases; import net.minecraft.client.renderer.Atlases;
import net.minecraft.client.renderer.IRenderTypeBuffer; import net.minecraft.client.renderer.IRenderTypeBuffer;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.model.ModelManager; import net.minecraft.client.renderer.model.ModelManager;
@@ -31,7 +29,9 @@ import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Matrix4f;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.vector.Vector3f;
import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.EmptyModelData;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -99,7 +99,7 @@ public class TileEntityTurtleRenderer extends TileEntityRenderer<TileTurtle>
transform.push(); transform.push();
// Setup the transform. // Setup the transform.
Vec3d offset = turtle.getRenderOffset( partialTicks ); Vector3d offset = turtle.getRenderOffset( partialTicks );
float yaw = turtle.getRenderYaw( partialTicks ); float yaw = turtle.getRenderYaw( partialTicks );
transform.translate( offset.x, offset.y, offset.z ); transform.translate( offset.x, offset.y, offset.z );

View File

@@ -57,16 +57,16 @@ public final class TurtleModelLoader implements IModelLoader<TurtleModelLoader.T
} }
@Override @Override
public Collection<Material> getTextures( IModelConfiguration owner, Function<ResourceLocation, IUnbakedModel> modelGetter, Set<Pair<String, String>> missingTextureErrors ) public Collection<RenderMaterial> getTextures( IModelConfiguration owner, Function<ResourceLocation, IUnbakedModel> modelGetter, Set<Pair<String, String>> missingTextureErrors )
{ {
Set<Material> materials = new HashSet<>(); Set<RenderMaterial> materials = new HashSet<>();
materials.addAll( modelGetter.apply( family ).getTextures( modelGetter, missingTextureErrors ) ); materials.addAll( modelGetter.apply( family ).getTextures( modelGetter, missingTextureErrors ) );
materials.addAll( modelGetter.apply( COLOUR_TURTLE_MODEL ).getTextures( modelGetter, missingTextureErrors ) ); materials.addAll( modelGetter.apply( COLOUR_TURTLE_MODEL ).getTextures( modelGetter, missingTextureErrors ) );
return materials; return materials;
} }
@Override @Override
public IBakedModel bake( IModelConfiguration owner, ModelBakery bakery, Function<Material, TextureAtlasSprite> spriteGetter, IModelTransform transform, ItemOverrideList overrides, ResourceLocation modelLocation ) public IBakedModel bake( IModelConfiguration owner, ModelBakery bakery, Function<RenderMaterial, TextureAtlasSprite> spriteGetter, IModelTransform transform, ItemOverrideList overrides, ResourceLocation modelLocation )
{ {
return new TurtleSmartItemModel( return new TurtleSmartItemModel(
bakery.getBakedModel( family, transform, spriteGetter ), bakery.getBakedModel( family, transform, spriteGetter ),

View File

@@ -7,12 +7,12 @@ package dan200.computercraft.client.render;
import dan200.computercraft.api.client.TransformedModel; import dan200.computercraft.api.client.TransformedModel;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.model.BakedQuad; import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.model.IBakedModel; import net.minecraft.client.renderer.model.IBakedModel;
import net.minecraft.client.renderer.model.ItemOverrideList; import net.minecraft.client.renderer.model.ItemOverrideList;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.vector.TransformationMatrix;
import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.EmptyModelData;
import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.data.IModelData;
import net.minecraftforge.client.model.pipeline.BakedQuadBuilder; import net.minecraftforge.client.model.pipeline.BakedQuadBuilder;

View File

@@ -15,14 +15,14 @@ import dan200.computercraft.shared.util.Holiday;
import dan200.computercraft.shared.util.HolidayUtil; import dan200.computercraft.shared.util.HolidayUtil;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.model.*; import net.minecraft.client.renderer.model.*;
import net.minecraft.client.renderer.texture.TextureAtlasSprite; import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World; import net.minecraft.util.math.vector.TransformationMatrix;
import net.minecraftforge.client.model.data.IModelData; import net.minecraftforge.client.model.data.IModelData;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -109,7 +109,7 @@ public class TurtleSmartItemModel implements IBakedModel
{ {
@Nonnull @Nonnull
@Override @Override
public IBakedModel getModelWithOverrides( @Nonnull IBakedModel originalModel, @Nonnull ItemStack stack, @Nullable World world, @Nullable LivingEntity entity ) public IBakedModel func_239290_a_( @Nonnull IBakedModel originalModel, @Nonnull ItemStack stack, @Nullable ClientWorld world, @Nullable LivingEntity entity )
{ {
ItemTurtle turtle = (ItemTurtle) stack.getItem(); ItemTurtle turtle = (ItemTurtle) stack.getItem();
int colour = turtle.getColour( stack ); int colour = turtle.getColour( stack );

View File

@@ -385,8 +385,8 @@ public class FSAPI implements ILuaAPI
* *
* @param path The path to check the free space for. * @param path The path to check the free space for.
* @return The amount of free space available, in bytes. * @return The amount of free space available, in bytes.
* @cc.treturn number|"unlimited" The amount of free space available, in bytes, or "unlimited".
* @throws LuaException If the path doesn't exist. * @throws LuaException If the path doesn't exist.
* @cc.treturn number|"unlimited" The amount of free space available, in bytes, or "unlimited".
*/ */
@LuaFunction @LuaFunction
public final Object getFreeSpace( String path ) throws LuaException public final Object getFreeSpace( String path ) throws LuaException
@@ -479,7 +479,6 @@ public class FSAPI implements ILuaAPI
BasicFileAttributes attributes = fileSystem.getAttributes( path ); BasicFileAttributes attributes = fileSystem.getAttributes( path );
Map<String, Object> result = new HashMap<>(); Map<String, Object> result = new HashMap<>();
result.put( "modification", getFileTime( attributes.lastModifiedTime() ) ); result.put( "modification", getFileTime( attributes.lastModifiedTime() ) );
result.put( "modified", getFileTime( attributes.lastModifiedTime() ) );
result.put( "created", getFileTime( attributes.creationTime() ) ); result.put( "created", getFileTime( attributes.creationTime() ) );
result.put( "size", attributes.isDirectory() ? 0 : attributes.size() ); result.put( "size", attributes.isDirectory() ? 0 : attributes.size() );
result.put( "isDir", attributes.isDirectory() ); result.put( "isDir", attributes.isDirectory() );

View File

@@ -171,18 +171,12 @@ public class OSAPI implements ILuaAPI
/** /**
* Starts a timer that will run for the specified number of seconds. Once * Starts a timer that will run for the specified number of seconds. Once
* the timer fires, a {@code timer} event will be added to the queue with * the timer fires, a timer event will be added to the queue with the ID
* the ID returned from this function as the first parameter. * returned from this function as the first parameter.
*
* As with @{os.sleep|sleep}, {@code timer} will automatically be rounded up
* to the nearest multiple of 0.05 seconds, as it waits for a fixed amount
* of world ticks.
* *
* @param timer The number of seconds until the timer fires. * @param timer The number of seconds until the timer fires.
* @return The ID of the new timer. This can be used to filter the * @return The ID of the new timer.
* {@code timer} event, or {@link #cancelTimer cancel the timer}.
* @throws LuaException If the time is below zero. * @throws LuaException If the time is below zero.
* @see #cancelTimer To cancel a timer.
*/ */
@LuaFunction @LuaFunction
public final int startTimer( double timer ) throws LuaException public final int startTimer( double timer ) throws LuaException
@@ -205,14 +199,11 @@ public class OSAPI implements ILuaAPI
/** /**
* Sets an alarm that will fire at the specified world time. When it fires, * Sets an alarm that will fire at the specified world time. When it fires,
* an {@code alarm} event will be added to the event queue with the ID * an alarm event will be added to the event queue.
* returned from this function as the first parameter.
* *
* @param time The time at which to fire the alarm, in the range [0.0, 24.0). * @param time The time at which to fire the alarm, in the range [0.0, 24.0).
* @return The ID of the new alarm. This can be used to filter the * @return The ID of the alarm that was set.
* {@code alarm} event, or {@link #cancelAlarm cancel the alarm}.
* @throws LuaException If the time is out of range. * @throws LuaException If the time is out of range.
* @see #cancelAlarm To cancel an alarm.
*/ */
@LuaFunction @LuaFunction
public final int setAlarm( double time ) throws LuaException public final int setAlarm( double time ) throws LuaException
@@ -312,10 +303,10 @@ public class OSAPI implements ILuaAPI
* always be in the range [0.0, 24.0). * always be in the range [0.0, 24.0).
* *
* * If called with {@code ingame}, the current world time will be returned. * * If called with {@code ingame}, the current world time will be returned.
* This is the default if nothing is passed. * This is the default if nothing is passed.
* * If called with {@code utc}, returns the hour of the day in UTC time. * * If called with {@code utc}, returns the hour of the day in UTC time.
* * If called with {@code local}, returns the hour of the day in the * * If called with {@code local}, returns the hour of the day in the
* timezone the server is located in. * timezone the server is located in.
* *
* This function can also be called with a table returned from {@link #date}, * This function can also be called with a table returned from {@link #date},
* which will convert the date fields into a UNIX timestamp (number of * which will convert the date fields into a UNIX timestamp (number of
@@ -323,9 +314,9 @@ public class OSAPI implements ILuaAPI
* *
* @param args The locale of the time, or a table filled by {@code os.date("*t")} to decode. Defaults to {@code ingame} locale if not specified. * @param args The locale of the time, or a table filled by {@code os.date("*t")} to decode. Defaults to {@code ingame} locale if not specified.
* @return The hour of the selected locale, or a UNIX timestamp from the table, depending on the argument passed in. * @return The hour of the selected locale, or a UNIX timestamp from the table, depending on the argument passed in.
* @throws LuaException If an invalid locale is passed.
* @cc.tparam [opt] string|table locale The locale of the time, or a table filled by {@code os.date("*t")} to decode. Defaults to {@code ingame} locale if not specified. * @cc.tparam [opt] string|table locale The locale of the time, or a table filled by {@code os.date("*t")} to decode. Defaults to {@code ingame} locale if not specified.
* @see #date To get a date table that can be converted with this function. * @see #date To get a date table that can be converted with this function.
* @throws LuaException If an invalid locale is passed.
*/ */
@LuaFunction @LuaFunction
public final Object time( IArguments args ) throws LuaException public final Object time( IArguments args ) throws LuaException
@@ -351,11 +342,11 @@ public class OSAPI implements ILuaAPI
* Returns the day depending on the locale specified. * Returns the day depending on the locale specified.
* *
* * If called with {@code ingame}, returns the number of days since the * * If called with {@code ingame}, returns the number of days since the
* world was created. This is the default. * world was created. This is the default.
* * If called with {@code utc}, returns the number of days since 1 January * * If called with {@code utc}, returns the number of days since 1 January
* 1970 in the UTC timezone. * 1970 in the UTC timezone.
* * If called with {@code local}, returns the number of days since 1 * * If called with {@code local}, returns the number of days since 1
* January 1970 in the server's local timezone. * January 1970 in the server's local timezone.
* *
* @param args The locale to get the day for. Defaults to {@code ingame} if not set. * @param args The locale to get the day for. Defaults to {@code ingame} if not set.
* @return The day depending on the selected locale. * @return The day depending on the selected locale.
@@ -381,11 +372,11 @@ public class OSAPI implements ILuaAPI
* Returns the number of seconds since an epoch depending on the locale. * Returns the number of seconds since an epoch depending on the locale.
* *
* * If called with {@code ingame}, returns the number of seconds since the * * If called with {@code ingame}, returns the number of seconds since the
* world was created. This is the default. * world was created. This is the default.
* * If called with {@code utc}, returns the number of seconds since 1 * * If called with {@code utc}, returns the number of seconds since 1
* January 1970 in the UTC timezone. * January 1970 in the UTC timezone.
* * If called with {@code local}, returns the number of seconds since 1 * * If called with {@code local}, returns the number of seconds since 1
* January 1970 in the server's local timezone. * January 1970 in the server's local timezone.
* *
* @param args The locale to get the seconds for. Defaults to {@code ingame} if not set. * @param args The locale to get the seconds for. Defaults to {@code ingame} if not set.
* @return The seconds since the epoch depending on the selected locale. * @return The seconds since the epoch depending on the selected locale.
@@ -435,7 +426,7 @@ public class OSAPI implements ILuaAPI
* timestamp (days since 1 January 1970) with {@link #date}. * timestamp (days since 1 January 1970) with {@link #date}.
* *
* @param formatA The format of the string to return. This defaults to {@code %c}, which expands to a string similar to "Sat Dec 24 16:58:00 2011". * @param formatA The format of the string to return. This defaults to {@code %c}, which expands to a string similar to "Sat Dec 24 16:58:00 2011".
* @param timeA The time to convert to a string. This defaults to the current time. * @param timeA The time to convert to a string. This defaults to the current time.
* @return The resulting format string. * @return The resulting format string.
* @throws LuaException If an invalid format is passed. * @throws LuaException If an invalid format is passed.
*/ */

View File

@@ -24,14 +24,14 @@ public class CheckUrl extends Resource<CheckUrl>
private final IAPIEnvironment environment; private final IAPIEnvironment environment;
private final String address; private final String address;
private final URI uri; private final String host;
public CheckUrl( ResourceGroup<CheckUrl> limiter, IAPIEnvironment environment, String address, URI uri ) public CheckUrl( ResourceGroup<CheckUrl> limiter, IAPIEnvironment environment, String address, URI uri )
{ {
super( limiter ); super( limiter );
this.environment = environment; this.environment = environment;
this.address = address; this.address = address;
this.uri = uri; host = uri.getHost();
} }
public void run() public void run()
@@ -47,9 +47,8 @@ public class CheckUrl extends Resource<CheckUrl>
try try
{ {
boolean ssl = uri.getScheme().equalsIgnoreCase( "https" ); InetSocketAddress netAddress = NetworkUtils.getAddress( host, 80, false );
InetSocketAddress netAddress = NetworkUtils.getAddress( uri, ssl ); NetworkUtils.getOptions( host, netAddress );
NetworkUtils.getOptions( uri.getHost(), netAddress );
if( tryClose() ) environment.queueEvent( EVENT, address, true ); if( tryClose() ) environment.queueEvent( EVENT, address, true );
} }

View File

@@ -19,7 +19,6 @@ import io.netty.handler.ssl.SslContextBuilder;
import javax.net.ssl.SSLException; import javax.net.ssl.SSLException;
import javax.net.ssl.TrustManagerFactory; import javax.net.ssl.TrustManagerFactory;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.URI;
import java.security.KeyStore; import java.security.KeyStore;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.SynchronousQueue; import java.util.concurrent.SynchronousQueue;
@@ -100,21 +99,6 @@ public final class NetworkUtils
} }
} }
/**
* Create a {@link InetSocketAddress} from a {@link java.net.URI}.
*
* Note, this may require a DNS lookup, and so should not be executed on the main CC thread.
*
* @param uri The URI to fetch.
* @param ssl Whether to connect with SSL. This is used to find the default port if not otherwise specified.
* @return The resolved address.
* @throws HTTPRequestException If the host is not malformed.
*/
public static InetSocketAddress getAddress( URI uri, boolean ssl ) throws HTTPRequestException
{
return getAddress( uri.getHost(), uri.getPort(), ssl );
}
/** /**
* Create a {@link InetSocketAddress} from the resolved {@code host} and port. * Create a {@link InetSocketAddress} from the resolved {@code host} and port.
* *
@@ -144,7 +128,7 @@ public final class NetworkUtils
*/ */
public static Options getOptions( String host, InetSocketAddress address ) throws HTTPRequestException public static Options getOptions( String host, InetSocketAddress address ) throws HTTPRequestException
{ {
Options options = AddressRule.apply( ComputerCraft.httpRules, host, address ); Options options = AddressRule.apply( ComputerCraft.httpRules, host, address.getAddress() );
if( options.action == Action.DENY ) throw new HTTPRequestException( "Domain not permitted" ); if( options.action == Action.DENY ) throw new HTTPRequestException( "Domain not permitted" );
return options; return options;
} }

View File

@@ -12,7 +12,6 @@ import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.net.Inet6Address; import java.net.Inet6Address;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.util.regex.Pattern; import java.util.regex.Pattern;
/** /**
@@ -53,23 +52,17 @@ public final class AddressRule
private final HostRange ip; private final HostRange ip;
private final Pattern domainPattern; private final Pattern domainPattern;
private final Integer port;
private final PartialOptions partial; private final PartialOptions partial;
private AddressRule( private AddressRule( @Nullable HostRange ip, @Nullable Pattern domainPattern, @Nonnull PartialOptions partial )
@Nullable HostRange ip,
@Nullable Pattern domainPattern,
@Nullable Integer port,
@Nonnull PartialOptions partial )
{ {
this.ip = ip; this.ip = ip;
this.domainPattern = domainPattern; this.domainPattern = domainPattern;
this.partial = partial; this.partial = partial;
this.port = port;
} }
@Nullable @Nullable
public static AddressRule parse( String filter, @Nullable Integer port, @Nonnull PartialOptions partial ) public static AddressRule parse( String filter, @Nonnull PartialOptions partial )
{ {
int cidr = filter.indexOf( '/' ); int cidr = filter.indexOf( '/' );
if( cidr >= 0 ) if( cidr >= 0 )
@@ -124,27 +117,24 @@ public final class AddressRule
size -= 8; size -= 8;
} }
return new AddressRule( new HostRange( minBytes, maxBytes ), null, port, partial ); return new AddressRule( new HostRange( minBytes, maxBytes ), null, partial );
} }
else else
{ {
Pattern pattern = Pattern.compile( "^\\Q" + filter.replaceAll( "\\*", "\\\\E.*\\\\Q" ) + "\\E$" ); Pattern pattern = Pattern.compile( "^\\Q" + filter.replaceAll( "\\*", "\\\\E.*\\\\Q" ) + "\\E$" );
return new AddressRule( null, pattern, port, partial ); return new AddressRule( null, pattern, partial );
} }
} }
/** /**
* Determine whether the given address matches a series of patterns. * Determine whether the given address matches a series of patterns.
* *
* @param domain The domain to match * @param domain The domain to match
* @param socketAddress The address to check. * @param address The address to check.
* @return Whether it matches any of these patterns. * @return Whether it matches any of these patterns.
*/ */
private boolean matches( String domain, InetSocketAddress socketAddress ) private boolean matches( String domain, InetAddress address )
{ {
InetAddress address = socketAddress.getAddress();
if( port != null && port != socketAddress.getPort() ) return false;
if( domainPattern != null ) if( domainPattern != null )
{ {
if( domainPattern.matcher( domain ).matches() ) return true; if( domainPattern.matcher( domain ).matches() ) return true;
@@ -165,7 +155,7 @@ public final class AddressRule
return ip != null && ip.contains( address ); return ip != null && ip.contains( address );
} }
public static Options apply( Iterable<? extends AddressRule> rules, String domain, InetSocketAddress address ) public static Options apply( Iterable<? extends AddressRule> rules, String domain, InetAddress address )
{ {
PartialOptions options = null; PartialOptions options = null;
boolean hasMany = false; boolean hasMany = false;

View File

@@ -49,14 +49,12 @@ public class AddressRuleConfig
public static boolean checkRule( UnmodifiableConfig builder ) public static boolean checkRule( UnmodifiableConfig builder )
{ {
String hostObj = get( builder, "host", String.class ).orElse( null ); String hostObj = get( builder, "host", String.class ).orElse( null );
Integer port = get( builder, "port", Number.class ).map( Number::intValue ).orElse( null );
return hostObj != null && checkEnum( builder, "action", Action.class ) return hostObj != null && checkEnum( builder, "action", Action.class )
&& check( builder, "port", Number.class )
&& check( builder, "timeout", Number.class ) && check( builder, "timeout", Number.class )
&& check( builder, "max_upload", Number.class ) && check( builder, "max_upload", Number.class )
&& check( builder, "max_download", Number.class ) && check( builder, "max_download", Number.class )
&& check( builder, "websocket_message", Number.class ) && check( builder, "websocket_message", Number.class )
&& AddressRule.parse( hostObj, port, PartialOptions.DEFAULT ) != null; && AddressRule.parse( hostObj, PartialOptions.DEFAULT ) != null;
} }
@Nullable @Nullable
@@ -66,7 +64,6 @@ public class AddressRuleConfig
if( hostObj == null ) return null; if( hostObj == null ) return null;
Action action = getEnum( builder, "action", Action.class ).orElse( null ); Action action = getEnum( builder, "action", Action.class ).orElse( null );
Integer port = get( builder, "port", Number.class ).map( Number::intValue ).orElse( null );
Integer timeout = get( builder, "timeout", Number.class ).map( Number::intValue ).orElse( null ); Integer timeout = get( builder, "timeout", Number.class ).map( Number::intValue ).orElse( null );
Long maxUpload = get( builder, "max_upload", Number.class ).map( Number::longValue ).orElse( null ); Long maxUpload = get( builder, "max_upload", Number.class ).map( Number::longValue ).orElse( null );
Long maxDownload = get( builder, "max_download", Number.class ).map( Number::longValue ).orElse( null ); Long maxDownload = get( builder, "max_download", Number.class ).map( Number::longValue ).orElse( null );
@@ -80,7 +77,7 @@ public class AddressRuleConfig
websocketMessage websocketMessage
); );
return AddressRule.parse( hostObj, port, options ); return AddressRule.parse( hostObj, options );
} }
private static <T> boolean check( UnmodifiableConfig config, String field, Class<T> klass ) private static <T> boolean check( UnmodifiableConfig config, String field, Class<T> klass )

View File

@@ -136,7 +136,7 @@ public class HttpRequest extends Resource<HttpRequest>
try try
{ {
boolean ssl = uri.getScheme().equalsIgnoreCase( "https" ); boolean ssl = uri.getScheme().equalsIgnoreCase( "https" );
InetSocketAddress socketAddress = NetworkUtils.getAddress( uri, ssl ); InetSocketAddress socketAddress = NetworkUtils.getAddress( uri.getHost(), uri.getPort(), ssl );
Options options = NetworkUtils.getOptions( uri.getHost(), socketAddress ); Options options = NetworkUtils.getOptions( uri.getHost(), socketAddress );
SslContext sslContext = ssl ? NetworkUtils.getSslContext() : null; SslContext sslContext = ssl ? NetworkUtils.getSslContext() : null;

View File

@@ -129,7 +129,8 @@ public class Websocket extends Resource<Websocket>
try try
{ {
boolean ssl = uri.getScheme().equalsIgnoreCase( "wss" ); boolean ssl = uri.getScheme().equalsIgnoreCase( "wss" );
InetSocketAddress socketAddress = NetworkUtils.getAddress( uri, ssl );
InetSocketAddress socketAddress = NetworkUtils.getAddress( uri.getHost(), uri.getPort(), ssl );
Options options = NetworkUtils.getOptions( uri.getHost(), socketAddress ); Options options = NetworkUtils.getOptions( uri.getHost(), socketAddress );
SslContext sslContext = ssl ? NetworkUtils.getSslContext() : null; SslContext sslContext = ssl ? NetworkUtils.getSslContext() : null;

View File

@@ -9,7 +9,6 @@ package dan200.computercraft.core.asm;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.lua.LuaFunction;
import dan200.computercraft.shared.peripheral.generic.GenericPeripheralProvider; import dan200.computercraft.shared.peripheral.generic.GenericPeripheralProvider;
import dan200.computercraft.shared.util.ServiceUtil;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -17,12 +16,11 @@ import java.lang.reflect.Method;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.function.Supplier; import java.util.ServiceLoader;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.StreamSupport;
/** /**
* A generic source of {@link LuaMethod} functions. This allows for injecting methods onto objects you do not own. * A generic source of {@link LuaMethod} functions. This allows for injecting methods onto objects you do not own.
@@ -44,18 +42,6 @@ public interface GenericSource
@Nonnull @Nonnull
ResourceLocation id(); ResourceLocation id();
/**
* Register a stream of generic sources.
*
* @param sources The source of generic methods.
* @see ServiceUtil For ways to load this. Sadly {@link java.util.ServiceLoader} is broken under Forge, but we don't
* want to add a hard-dep on Forge within core either.
*/
static void setup( Supplier<Stream<GenericSource>> sources )
{
GenericMethod.sources = sources;
}
/** /**
* A generic method is a method belonging to a {@link GenericSource} with a known target. * A generic method is a method belonging to a {@link GenericSource} with a known target.
*/ */
@@ -65,7 +51,6 @@ public interface GenericSource
final LuaFunction annotation; final LuaFunction annotation;
final Class<?> target; final Class<?> target;
static Supplier<Stream<GenericSource>> sources;
private static List<GenericMethod> cache; private static List<GenericMethod> cache;
GenericMethod( Method method, LuaFunction annotation, Class<?> target ) GenericMethod( Method method, LuaFunction annotation, Class<?> target )
@@ -83,16 +68,10 @@ public interface GenericSource
static List<GenericMethod> all() static List<GenericMethod> all()
{ {
if( cache != null ) return cache; if( cache != null ) return cache;
if( sources == null ) return cache = StreamSupport
{ .stream( ServiceLoader.load( GenericSource.class, GenericSource.class.getClassLoader() ).spliterator(), false )
ComputerCraft.log.warn( "Getting GenericMethods without a provider" );
return cache = Collections.emptyList();
}
return cache = sources.get()
.flatMap( x -> Arrays.stream( x.getClass().getDeclaredMethods() ) ) .flatMap( x -> Arrays.stream( x.getClass().getDeclaredMethods() ) )
.map( method -> .map( method -> {
{
LuaFunction annotation = method.getAnnotation( LuaFunction.class ); LuaFunction annotation = method.getAnnotation( LuaFunction.class );
if( annotation == null ) return null; if( annotation == null ) return null;

View File

@@ -395,7 +395,14 @@ public final class ComputerThread
executor.timeout.hardAbort(); executor.timeout.hardAbort();
executor.abort(); executor.abort();
if( afterHardAbort >= ABORT_TIMEOUT * 2 ) if( afterHardAbort >= ABORT_TIMEOUT )
{
// If we've hard aborted but we're still not dead, dump the stack trace and interrupt
// the task.
timeoutTask( executor, runner.owner, afterStart );
runner.owner.interrupt();
}
else if( afterHardAbort >= ABORT_TIMEOUT * 2 )
{ {
// If we've hard aborted and interrupted, and we're still not dead, then mark the runner // If we've hard aborted and interrupted, and we're still not dead, then mark the runner
// as dead, finish off the task, and spawn a new runner. // as dead, finish off the task, and spawn a new runner.
@@ -414,13 +421,6 @@ public final class ComputerThread
} }
} }
} }
else if( afterHardAbort >= ABORT_TIMEOUT )
{
// If we've hard aborted but we're still not dead, dump the stack trace and interrupt
// the task.
timeoutTask( executor, runner.owner, afterStart );
runner.owner.interrupt();
}
} }
} }
} }

View File

@@ -124,7 +124,7 @@ public class FileSystemWrapperMount implements IFileSystem
{ {
try try
{ {
return m_filesystem.isDir( path ); return m_filesystem.exists( path );
} }
catch( FileSystemException e ) catch( FileSystemException e )
{ {

View File

@@ -83,9 +83,9 @@ class VarargArguments implements IArguments
public ByteBuffer getBytes( int index ) throws LuaException public ByteBuffer getBytes( int index ) throws LuaException
{ {
LuaValue value = varargs.arg( index + 1 ); LuaValue value = varargs.arg( index + 1 );
if( !(value instanceof LuaBaseString) ) throw LuaValues.badArgument( index, "string", value.typeName() ); if( !(value instanceof LuaString) ) throw LuaValues.badArgument( index, "string", value.typeName() );
LuaString str = ((LuaBaseString) value).strvalue(); LuaString str = (LuaString) value;
return ByteBuffer.wrap( str.bytes, str.offset, str.length ).asReadOnlyBuffer(); return ByteBuffer.wrap( str.bytes, str.offset, str.length ).asReadOnlyBuffer();
} }
@@ -94,9 +94,9 @@ class VarargArguments implements IArguments
{ {
LuaValue value = varargs.arg( index + 1 ); LuaValue value = varargs.arg( index + 1 );
if( value.isNil() ) return Optional.empty(); if( value.isNil() ) return Optional.empty();
if( !(value instanceof LuaBaseString) ) throw LuaValues.badArgument( index, "string", value.typeName() ); if( !(value instanceof LuaString) ) throw LuaValues.badArgument( index, "string", value.typeName() );
LuaString str = ((LuaBaseString) value).strvalue(); LuaString str = (LuaString) value;
return Optional.of( ByteBuffer.wrap( str.bytes, str.offset, str.length ).asReadOnlyBuffer() ); return Optional.of( ByteBuffer.wrap( str.bytes, str.offset, str.length ).asReadOnlyBuffer() );
} }
} }

View File

@@ -7,6 +7,7 @@
package dan200.computercraft.data; package dan200.computercraft.data;
import dan200.computercraft.shared.proxy.ComputerCraftProxyCommon; import dan200.computercraft.shared.proxy.ComputerCraftProxyCommon;
import net.minecraft.data.BlockTagsProvider;
import net.minecraft.data.DataGenerator; import net.minecraft.data.DataGenerator;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
@@ -23,6 +24,6 @@ public class Generators
DataGenerator generator = event.getGenerator(); DataGenerator generator = event.getGenerator();
generator.addProvider( new Recipes( generator ) ); generator.addProvider( new Recipes( generator ) );
generator.addProvider( new LootTables( generator ) ); generator.addProvider( new LootTables( generator ) );
generator.addProvider( new Tags( generator ) ); generator.addProvider( new Tags( generator, new BlockTagsProvider( generator ) ) );
} }
} }

View File

@@ -13,11 +13,11 @@ import dan200.computercraft.ComputerCraft;
import net.minecraft.data.DataGenerator; import net.minecraft.data.DataGenerator;
import net.minecraft.data.DirectoryCache; import net.minecraft.data.DirectoryCache;
import net.minecraft.data.IDataProvider; import net.minecraft.data.IDataProvider;
import net.minecraft.loot.LootParameterSets;
import net.minecraft.loot.LootTable;
import net.minecraft.loot.LootTableManager;
import net.minecraft.loot.ValidationTracker;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.storage.loot.LootParameterSets;
import net.minecraft.world.storage.loot.LootTable;
import net.minecraft.world.storage.loot.LootTableManager;
import net.minecraft.world.storage.loot.ValidationTracker;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.io.IOException; import java.io.IOException;

View File

@@ -14,10 +14,10 @@ import dan200.computercraft.shared.data.PlayerCreativeLootCondition;
import dan200.computercraft.shared.proxy.ComputerCraftProxyCommon; import dan200.computercraft.shared.proxy.ComputerCraftProxyCommon;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.data.DataGenerator; import net.minecraft.data.DataGenerator;
import net.minecraft.loot.*;
import net.minecraft.loot.conditions.Alternative;
import net.minecraft.loot.conditions.SurvivesExplosion;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.storage.loot.*;
import net.minecraft.world.storage.loot.conditions.Alternative;
import net.minecraft.world.storage.loot.conditions.SurvivesExplosion;
import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.fml.RegistryObject;
import java.util.function.BiConsumer; import java.util.function.BiConsumer;
@@ -77,9 +77,9 @@ public class LootTables extends LootTableProvider
.rolls( ConstantRange.of( 1 ) ) .rolls( ConstantRange.of( 1 ) )
.addEntry( DynamicLootEntry.func_216162_a( new ResourceLocation( ComputerCraft.MOD_ID, "computer" ) ) ) .addEntry( DynamicLootEntry.func_216162_a( new ResourceLocation( ComputerCraft.MOD_ID, "computer" ) ) )
.acceptCondition( Alternative.builder( .acceptCondition( Alternative.builder(
BlockNamedEntityLootCondition.builder(), BlockNamedEntityLootCondition.BUILDER,
HasComputerIdLootCondition.builder(), HasComputerIdLootCondition.BUILDER,
PlayerCreativeLootCondition.builder().inverted() PlayerCreativeLootCondition.BUILDER.inverted()
) ) ) )
).build() ); ).build() );
} }

View File

@@ -21,7 +21,7 @@ import net.minecraft.advancements.criterion.ItemPredicate;
import net.minecraft.block.Blocks; import net.minecraft.block.Blocks;
import net.minecraft.data.*; import net.minecraft.data.*;
import net.minecraft.item.*; import net.minecraft.item.*;
import net.minecraft.tags.Tag; import net.minecraft.tags.ITag;
import net.minecraft.util.IItemProvider; import net.minecraft.util.IItemProvider;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraftforge.common.Tags; import net.minecraftforge.common.Tags;
@@ -309,7 +309,7 @@ public class Recipes extends RecipeProvider
return DyeColor.byId( 15 - colour.ordinal() ); return DyeColor.byId( 15 - colour.ordinal() );
} }
private static InventoryChangeTrigger.Instance inventoryChange( Tag<Item> stack ) private static InventoryChangeTrigger.Instance inventoryChange( ITag<Item> stack )
{ {
return InventoryChangeTrigger.Instance.forItems( ItemPredicate.Builder.create().tag( stack ).build() ); return InventoryChangeTrigger.Instance.forItems( ItemPredicate.Builder.create().tag( stack ).build() );
} }

View File

@@ -8,46 +8,54 @@ package dan200.computercraft.data;
import dan200.computercraft.ComputerCraft; import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.Registry; import dan200.computercraft.shared.Registry;
import net.minecraft.data.BlockTagsProvider;
import net.minecraft.data.DataGenerator; import net.minecraft.data.DataGenerator;
import net.minecraft.data.ItemTagsProvider; import net.minecraft.data.ItemTagsProvider;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.tags.ITag;
import net.minecraft.tags.ItemTags; import net.minecraft.tags.ItemTags;
import net.minecraft.tags.Tag;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import static dan200.computercraft.data.Tags.CCTags.*; import static dan200.computercraft.data.Tags.CCTags.*;
public class Tags extends ItemTagsProvider public class Tags extends ItemTagsProvider
{ {
private static final ITag.INamedTag<Item> PIGLIN_LOVED = ItemTags.field_232903_N_;
public static class CCTags public static class CCTags
{ {
public static final Tag<Item> COMPUTER = item( "computer" ); public static final ITag.INamedTag<Item> COMPUTER = item( "computer" );
public static final Tag<Item> TURTLE = item( "turtle" ); public static final ITag.INamedTag<Item> TURTLE = item( "turtle" );
public static final Tag<Item> WIRED_MODEM = item( "wired_modem" ); public static final ITag.INamedTag<Item> WIRED_MODEM = item( "wired_modem" );
public static final Tag<Item> MONITOR = item( "monitor" ); public static final ITag.INamedTag<Item> MONITOR = item( "monitor" );
} }
public Tags( DataGenerator generator ) public Tags( DataGenerator generator, BlockTagsProvider tags )
{ {
super( generator ); super( generator, tags );
} }
@Override @Override
protected void registerTags() protected void registerTags()
{ {
getBuilder( COMPUTER ) func_240522_a_( COMPUTER ).func_240534_a_(
.add( Registry.ModItems.COMPUTER_NORMAL.get() ) Registry.ModItems.COMPUTER_NORMAL.get(),
.add( Registry.ModItems.COMPUTER_ADVANCED.get() ) Registry.ModItems.COMPUTER_ADVANCED.get(),
.add( Registry.ModItems.COMPUTER_COMMAND.get() ); Registry.ModItems.COMPUTER_COMMAND.get()
getBuilder( TURTLE ).add( Registry.ModItems.TURTLE_NORMAL.get(), Registry.ModItems.TURTLE_ADVANCED.get() ); );
getBuilder( WIRED_MODEM ).add( Registry.ModItems.WIRED_MODEM.get(), Registry.ModItems.WIRED_MODEM_FULL.get() ); func_240522_a_( TURTLE ).func_240534_a_( Registry.ModItems.TURTLE_NORMAL.get(), Registry.ModItems.TURTLE_ADVANCED.get() );
getBuilder( MONITOR ) func_240522_a_( WIRED_MODEM ).func_240534_a_( Registry.ModItems.WIRED_MODEM.get(), Registry.ModItems.WIRED_MODEM_FULL.get() );
.add( Registry.ModItems.MONITOR_NORMAL.get() ) func_240522_a_( MONITOR ).func_240534_a_( Registry.ModItems.MONITOR_NORMAL.get(), Registry.ModItems.MONITOR_ADVANCED.get() );
.add( Registry.ModItems.MONITOR_ADVANCED.get() );
func_240522_a_( PIGLIN_LOVED ).func_240534_a_(
Registry.ModItems.COMPUTER_ADVANCED.get(), Registry.ModItems.TURTLE_ADVANCED.get(),
Registry.ModItems.WIRELESS_MODEM_ADVANCED.get(), Registry.ModItems.POCKET_COMPUTER_ADVANCED.get(),
Registry.ModItems.MONITOR_ADVANCED.get()
);
} }
private static Tag<Item> item( String name ) private static ITag.INamedTag<Item> item( String name )
{ {
return new ItemTags.Wrapper( new ResourceLocation( ComputerCraft.MOD_ID, name ) ); return ItemTags.makeWrapperTag( new ResourceLocation( ComputerCraft.MOD_ID, name ).toString() );
} }
} }

View File

@@ -92,7 +92,7 @@ public final class Registry
public static final class ModBlocks public static final class ModBlocks
{ {
static final DeferredRegister<Block> BLOCKS = new DeferredRegister<>( ForgeRegistries.BLOCKS, ComputerCraft.MOD_ID ); static final DeferredRegister<Block> BLOCKS = DeferredRegister.create( ForgeRegistries.BLOCKS, ComputerCraft.MOD_ID );
private static Block.Properties properties() private static Block.Properties properties()
{ {
@@ -145,7 +145,7 @@ public final class Registry
public static class ModTiles public static class ModTiles
{ {
static final DeferredRegister<TileEntityType<?>> TILES = new DeferredRegister<>( ForgeRegistries.TILE_ENTITIES, ComputerCraft.MOD_ID ); static final DeferredRegister<TileEntityType<?>> TILES = DeferredRegister.create( ForgeRegistries.TILE_ENTITIES, ComputerCraft.MOD_ID );
private static <T extends TileEntity> RegistryObject<TileEntityType<T>> ofBlock( RegistryObject<? extends Block> block, Function<TileEntityType<T>, T> factory ) private static <T extends TileEntity> RegistryObject<TileEntityType<T>> ofBlock( RegistryObject<? extends Block> block, Function<TileEntityType<T>, T> factory )
{ {
@@ -183,7 +183,7 @@ public final class Registry
public static final class ModItems public static final class ModItems
{ {
static final DeferredRegister<Item> ITEMS = new DeferredRegister<>( ForgeRegistries.ITEMS, ComputerCraft.MOD_ID ); static final DeferredRegister<Item> ITEMS = DeferredRegister.create( ForgeRegistries.ITEMS, ComputerCraft.MOD_ID );
private static Item.Properties properties() private static Item.Properties properties()
{ {
@@ -281,7 +281,7 @@ public final class Registry
public static class ModEntities public static class ModEntities
{ {
static final DeferredRegister<EntityType<?>> ENTITIES = new DeferredRegister<>( ForgeRegistries.ENTITIES, ComputerCraft.MOD_ID ); static final DeferredRegister<EntityType<?>> ENTITIES = DeferredRegister.create( ForgeRegistries.ENTITIES, ComputerCraft.MOD_ID );
public static final RegistryObject<EntityType<TurtlePlayer>> TURTLE_PLAYER = ENTITIES.register( "turtle_player", () -> public static final RegistryObject<EntityType<TurtlePlayer>> TURTLE_PLAYER = ENTITIES.register( "turtle_player", () ->
EntityType.Builder.<TurtlePlayer>create( EntityClassification.MISC ) EntityType.Builder.<TurtlePlayer>create( EntityClassification.MISC )
@@ -293,7 +293,7 @@ public final class Registry
public static class ModContainers public static class ModContainers
{ {
static final DeferredRegister<ContainerType<?>> CONTAINERS = new DeferredRegister<>( ForgeRegistries.CONTAINERS, ComputerCraft.MOD_ID ); static final DeferredRegister<ContainerType<?>> CONTAINERS = DeferredRegister.create( ForgeRegistries.CONTAINERS, ComputerCraft.MOD_ID );
public static final RegistryObject<ContainerType<ContainerComputer>> COMPUTER = CONTAINERS.register( "computer", public static final RegistryObject<ContainerType<ContainerComputer>> COMPUTER = CONTAINERS.register( "computer",
() -> ContainerData.toType( ComputerContainerData::new, ContainerComputer::new ) ); () -> ContainerData.toType( ComputerContainerData::new, ContainerComputer::new ) );

View File

@@ -11,6 +11,7 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld;
import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod; import net.minecraftforge.fml.common.Mod;
@@ -20,13 +21,12 @@ public final class TurtlePermissions
public static boolean isBlockEnterable( World world, BlockPos pos, PlayerEntity player ) public static boolean isBlockEnterable( World world, BlockPos pos, PlayerEntity player )
{ {
MinecraftServer server = world.getServer(); MinecraftServer server = world.getServer();
return server == null || world.isRemote || !server.isBlockProtected( world, pos, player ); return server == null || world.isRemote || (world instanceof ServerWorld && !server.isBlockProtected( (ServerWorld) world, pos, player ));
} }
public static boolean isBlockEditable( World world, BlockPos pos, PlayerEntity player ) public static boolean isBlockEditable( World world, BlockPos pos, PlayerEntity player )
{ {
MinecraftServer server = world.getServer(); return isBlockEnterable( world, pos, player );
return server == null || world.isRemote || !server.isBlockProtected( world, pos, player );
} }
@SubscribeEvent @SubscribeEvent

View File

@@ -30,6 +30,7 @@ import net.minecraft.inventory.container.Container;
import net.minecraft.inventory.container.INamedContainerProvider; import net.minecraft.inventory.container.INamedContainerProvider;
import net.minecraft.network.play.server.SPlayerPositionLookPacket; import net.minecraft.network.play.server.SPlayerPositionLookPacket;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.IFormattableTextComponent;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TranslationTextComponent;
@@ -283,16 +284,16 @@ public final class CommandComputerCraft
private static ITextComponent linkComputer( CommandSource source, ServerComputer serverComputer, int computerId ) private static ITextComponent linkComputer( CommandSource source, ServerComputer serverComputer, int computerId )
{ {
ITextComponent out = new StringTextComponent( "" ); IFormattableTextComponent out = new StringTextComponent( "" );
// Append the computer instance // Append the computer instance
if( serverComputer == null ) if( serverComputer == null )
{ {
out.appendSibling( text( "?" ) ); out.func_230529_a_( text( "?" ) );
} }
else else
{ {
out.appendSibling( link( out.func_230529_a_( link(
text( Integer.toString( serverComputer.getInstanceID() ) ), text( Integer.toString( serverComputer.getInstanceID() ) ),
"/computercraft dump " + serverComputer.getInstanceID(), "/computercraft dump " + serverComputer.getInstanceID(),
translate( "commands.computercraft.dump.action" ) translate( "commands.computercraft.dump.action" )
@@ -300,20 +301,20 @@ public final class CommandComputerCraft
} }
// And ID // And ID
out.appendText( " (id " + computerId + ")" ); out.func_240702_b_( " (id " + computerId + ")" );
// And, if we're a player, some useful links // And, if we're a player, some useful links
if( serverComputer != null && UserLevel.OP.test( source ) && isPlayer( source ) ) if( serverComputer != null && UserLevel.OP.test( source ) && isPlayer( source ) )
{ {
out out
.appendText( " " ) .func_240702_b_( " " )
.appendSibling( link( .func_230529_a_( link(
text( "\u261b" ), text( "\u261b" ),
"/computercraft tp " + serverComputer.getInstanceID(), "/computercraft tp " + serverComputer.getInstanceID(),
translate( "commands.computercraft.tp.action" ) translate( "commands.computercraft.tp.action" )
) ) ) )
.appendText( " " ) .func_240702_b_( " " )
.appendSibling( link( .func_230529_a_( link(
text( "\u20e2" ), text( "\u20e2" ),
"/computercraft view " + serverComputer.getInstanceID(), "/computercraft view " + serverComputer.getInstanceID(),
translate( "commands.computercraft.view.action" ) translate( "commands.computercraft.view.action" )

View File

@@ -13,6 +13,7 @@ import com.mojang.brigadier.context.CommandContext;
import com.mojang.brigadier.tree.CommandNode; import com.mojang.brigadier.tree.CommandNode;
import com.mojang.brigadier.tree.LiteralCommandNode; import com.mojang.brigadier.tree.LiteralCommandNode;
import net.minecraft.command.CommandSource; import net.minecraft.command.CommandSource;
import net.minecraft.util.text.IFormattableTextComponent;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
@@ -173,12 +174,12 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder<Command
temp.addChild( node ); temp.addChild( node );
String usage = dispatcher.getSmartUsage( temp, context.getSource() ).get( node ).substring( node.getName().length() ); String usage = dispatcher.getSmartUsage( temp, context.getSource() ).get( node ).substring( node.getName().length() );
ITextComponent output = new StringTextComponent( "" ) IFormattableTextComponent output = new StringTextComponent( "" )
.appendSibling( coloured( "/" + command + usage, HEADER ) ) .func_230529_a_( coloured( "/" + command + usage, HEADER ) )
.appendText( " " ) .func_240702_b_( " " )
.appendSibling( coloured( translate( "commands." + id + ".synopsis" ), SYNOPSIS ) ) .func_230529_a_( coloured( translate( "commands." + id + ".synopsis" ), SYNOPSIS ) )
.appendText( "\n" ) .func_240702_b_( "\n" )
.appendSibling( translate( "commands." + id + ".desc" ) ); .func_230529_a_( translate( "commands." + id + ".desc" ) );
for( CommandNode<CommandSource> child : node.getChildren() ) for( CommandNode<CommandSource> child : node.getChildren() )
{ {
@@ -187,16 +188,16 @@ public final class HelpingArgumentBuilder extends LiteralArgumentBuilder<Command
continue; continue;
} }
output.appendText( "\n" ); output.func_240702_b_( "\n" );
ITextComponent component = coloured( child.getName(), NAME ); IFormattableTextComponent component = coloured( child.getName(), NAME );
component.getStyle().setClickEvent( new ClickEvent( component.getStyle().setClickEvent( new ClickEvent(
ClickEvent.Action.SUGGEST_COMMAND, ClickEvent.Action.SUGGEST_COMMAND,
"/" + command + " " + child.getName() "/" + command + " " + child.getName()
) ); ) );
output.appendSibling( component ); output.func_230529_a_( component );
output.appendText( " - " ).appendSibling( translate( "commands." + id + "." + child.getName() + ".synopsis" ) ); output.func_240702_b_( " - " ).func_230529_a_( translate( "commands." + id + "." + child.getName() + ".synopsis" ) );
} }
return output; return output;

View File

@@ -19,69 +19,69 @@ public final class ChatHelpers
private ChatHelpers() {} private ChatHelpers() {}
public static ITextComponent coloured( String text, TextFormatting colour ) public static IFormattableTextComponent coloured( String text, TextFormatting colour )
{ {
ITextComponent component = new StringTextComponent( text == null ? "" : text ); IFormattableTextComponent component = new StringTextComponent( text == null ? "" : text );
component.getStyle().setColor( colour ); component.getStyle().setFormatting( colour );
return component; return component;
} }
public static <T extends ITextComponent> T coloured( T component, TextFormatting colour ) public static <T extends IFormattableTextComponent> T coloured( T component, TextFormatting colour )
{ {
component.getStyle().setColor( colour ); component.getStyle().setFormatting( colour );
return component; return component;
} }
public static ITextComponent text( String text ) public static IFormattableTextComponent text( String text )
{ {
return new StringTextComponent( text == null ? "" : text ); return new StringTextComponent( text == null ? "" : text );
} }
public static ITextComponent translate( String text ) public static IFormattableTextComponent translate( String text )
{ {
return new TranslationTextComponent( text == null ? "" : text ); return new TranslationTextComponent( text == null ? "" : text );
} }
public static ITextComponent translate( String text, Object... args ) public static IFormattableTextComponent translate( String text, Object... args )
{ {
return new TranslationTextComponent( text == null ? "" : text, args ); return new TranslationTextComponent( text == null ? "" : text, args );
} }
public static ITextComponent list( ITextComponent... children ) public static IFormattableTextComponent list( ITextComponent... children )
{ {
ITextComponent component = new StringTextComponent( "" ); IFormattableTextComponent component = new StringTextComponent( "" );
for( ITextComponent child : children ) for( ITextComponent child : children )
{ {
component.appendSibling( child ); component.func_230529_a_( child );
} }
return component; return component;
} }
public static ITextComponent position( BlockPos pos ) public static IFormattableTextComponent position( BlockPos pos )
{ {
if( pos == null ) return translate( "commands.computercraft.generic.no_position" ); if( pos == null ) return translate( "commands.computercraft.generic.no_position" );
return translate( "commands.computercraft.generic.position", pos.getX(), pos.getY(), pos.getZ() ); return translate( "commands.computercraft.generic.position", pos.getX(), pos.getY(), pos.getZ() );
} }
public static ITextComponent bool( boolean value ) public static IFormattableTextComponent bool( boolean value )
{ {
return value return value
? coloured( translate( "commands.computercraft.generic.yes" ), TextFormatting.GREEN ) ? coloured( translate( "commands.computercraft.generic.yes" ), TextFormatting.GREEN )
: coloured( translate( "commands.computercraft.generic.no" ), TextFormatting.RED ); : coloured( translate( "commands.computercraft.generic.no" ), TextFormatting.RED );
} }
public static ITextComponent link( ITextComponent component, String command, ITextComponent toolTip ) public static IFormattableTextComponent link( IFormattableTextComponent component, String command, ITextComponent toolTip )
{ {
Style style = component.getStyle(); Style style = component.getStyle();
if( style.getColor() == null ) style.setColor( TextFormatting.YELLOW ); if( style.getColor() == null ) style.setFormatting( TextFormatting.YELLOW );
style.setClickEvent( new ClickEvent( ClickEvent.Action.RUN_COMMAND, command ) ); style.setClickEvent( new ClickEvent( ClickEvent.Action.RUN_COMMAND, command ) );
style.setHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, toolTip ) ); style.setHoverEvent( new HoverEvent( HoverEvent.Action.SHOW_TEXT, toolTip ) );
return component; return component;
} }
public static ITextComponent header( String text ) public static IFormattableTextComponent header( String text )
{ {
return coloured( text, HEADER ); return coloured( text, HEADER );
} }

View File

@@ -79,12 +79,12 @@ public interface TableFormatter
StringTextComponent line = new StringTextComponent( "" ); StringTextComponent line = new StringTextComponent( "" );
for( int i = 0; i < columns - 1; i++ ) for( int i = 0; i < columns - 1; i++ )
{ {
line.appendSibling( headers[i] ); line.func_230529_a_( headers[i] );
ITextComponent padding = getPadding( headers[i], maxWidths[i] ); ITextComponent padding = getPadding( headers[i], maxWidths[i] );
if( padding != null ) line.appendSibling( padding ); if( padding != null ) line.func_230529_a_( padding );
line.appendSibling( SEPARATOR ); line.func_230529_a_( SEPARATOR );
} }
line.appendSibling( headers[columns - 1] ); line.func_230529_a_( headers[columns - 1] );
writeLine( rowId++, line ); writeLine( rowId++, line );
@@ -100,12 +100,12 @@ public interface TableFormatter
StringTextComponent line = new StringTextComponent( "" ); StringTextComponent line = new StringTextComponent( "" );
for( int i = 0; i < columns - 1; i++ ) for( int i = 0; i < columns - 1; i++ )
{ {
line.appendSibling( row[i] ); line.func_230529_a_( row[i] );
ITextComponent padding = getPadding( row[i], maxWidths[i] ); ITextComponent padding = getPadding( row[i], maxWidths[i] );
if( padding != null ) line.appendSibling( padding ); if( padding != null ) line.func_230529_a_( padding );
line.appendSibling( SEPARATOR ); line.func_230529_a_( SEPARATOR );
} }
line.appendSibling( row[columns - 1] ); line.func_230529_a_( row[columns - 1] );
writeLine( rowId++, line ); writeLine( rowId++, line );
} }

View File

@@ -105,9 +105,9 @@ public abstract class TileGeneric extends TileEntity
} }
@Override @Override
public void handleUpdateTag( @Nonnull CompoundNBT tag ) public void handleUpdateTag( @Nonnull BlockState state, @Nonnull CompoundNBT tag )
{ {
super.handleUpdateTag( tag ); super.handleUpdateTag( state, tag );
readDescription( tag ); readDescription( tag );
} }
} }

View File

@@ -16,6 +16,8 @@ import net.minecraft.block.BlockState;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.loot.LootContext;
import net.minecraft.loot.LootParameters;
import net.minecraft.stats.Stats; import net.minecraft.stats.Stats;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
@@ -24,11 +26,8 @@ import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.RayTraceResult;
import net.minecraft.world.IBlockReader; import net.minecraft.world.IBlockReader;
import net.minecraft.world.IWorldReader;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.server.ServerWorld; import net.minecraft.world.server.ServerWorld;
import net.minecraft.world.storage.loot.LootContext;
import net.minecraft.world.storage.loot.LootParameters;
import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.fml.RegistryObject;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -181,10 +180,4 @@ public abstract class BlockComputerBase<T extends TileComputerBase> extends Bloc
if( label != null ) computer.setLabel( label ); if( label != null ) computer.setLabel( label );
} }
} }
@Override
public boolean shouldCheckWeakPower( BlockState state, IWorldReader world, BlockPos pos, Direction side )
{
return false;
}
} }

View File

@@ -14,8 +14,8 @@ import net.minecraft.command.ICommandSource;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.server.MinecraftServer; import net.minecraft.server.MinecraftServer;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.math.Vec2f; import net.minecraft.util.math.vector.Vector2f;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TranslationTextComponent;
@@ -25,6 +25,7 @@ import net.minecraft.world.server.ServerWorld;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID;
public class TileCommandComputer extends TileComputer public class TileCommandComputer extends TileComputer
{ {
@@ -48,7 +49,7 @@ public class TileCommandComputer extends TileComputer
} }
@Override @Override
public void sendMessage( @Nonnull ITextComponent textComponent ) public void sendMessage( @Nonnull ITextComponent textComponent, @Nonnull UUID id )
{ {
output.put( output.size() + 1, textComponent.getString() ); output.put( output.size() + 1, textComponent.getString() );
} }
@@ -96,7 +97,7 @@ public class TileCommandComputer extends TileComputer
} }
return new CommandSource( receiver, return new CommandSource( receiver,
new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ), Vec2f.ZERO, new Vector3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ), Vector2f.ZERO,
(ServerWorld) getWorld(), 2, (ServerWorld) getWorld(), 2,
name, new StringTextComponent( name ), name, new StringTextComponent( name ),
getWorld().getServer(), null getWorld().getServer(), null

View File

@@ -189,9 +189,9 @@ public abstract class TileComputerBase extends TileGeneric implements IComputerT
} }
@Override @Override
public void read( @Nonnull CompoundNBT nbt ) public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
{ {
super.read( nbt ); super.read( state, nbt );
// Load ID, label and power state // Load ID, label and power state
m_computerID = nbt.contains( NBT_ID ) ? nbt.getInt( NBT_ID ) : -1; m_computerID = nbt.contains( NBT_ID ) ? nbt.getInt( NBT_ID ) : -1;

View File

@@ -24,7 +24,7 @@ public enum ComputerState implements IStringSerializable
@Nonnull @Nonnull
@Override @Override
public String getName() public String getString()
{ {
return name; return name;
} }

View File

@@ -43,7 +43,7 @@ public abstract class ItemComputerBase extends BlockItem implements IComputerIte
if( id >= 0 ) if( id >= 0 )
{ {
list.add( new TranslationTextComponent( "gui.computercraft.tooltip.computer_id", id ) list.add( new TranslationTextComponent( "gui.computercraft.tooltip.computer_id", id )
.applyTextStyle( TextFormatting.GRAY ) ); .func_240699_a_( TextFormatting.GRAY ) );
} }
} }
} }

View File

@@ -5,12 +5,13 @@
*/ */
package dan200.computercraft.shared.data; package dan200.computercraft.shared.data;
import net.minecraft.loot.LootConditionType;
import net.minecraft.loot.LootContext;
import net.minecraft.loot.LootParameter;
import net.minecraft.loot.LootParameters;
import net.minecraft.loot.conditions.ILootCondition;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.INameable; import net.minecraft.util.INameable;
import net.minecraft.world.storage.loot.LootContext;
import net.minecraft.world.storage.loot.LootParameter;
import net.minecraft.world.storage.loot.LootParameters;
import net.minecraft.world.storage.loot.conditions.ILootCondition;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.Collections; import java.util.Collections;
@@ -22,6 +23,8 @@ import java.util.Set;
public final class BlockNamedEntityLootCondition implements ILootCondition public final class BlockNamedEntityLootCondition implements ILootCondition
{ {
public static final BlockNamedEntityLootCondition INSTANCE = new BlockNamedEntityLootCondition(); public static final BlockNamedEntityLootCondition INSTANCE = new BlockNamedEntityLootCondition();
public static final LootConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE );
public static final IBuilder BUILDER = () -> INSTANCE;
private BlockNamedEntityLootCondition() private BlockNamedEntityLootCondition()
{ {
@@ -41,8 +44,10 @@ public final class BlockNamedEntityLootCondition implements ILootCondition
return Collections.singleton( LootParameters.BLOCK_ENTITY ); return Collections.singleton( LootParameters.BLOCK_ENTITY );
} }
public static IBuilder builder() @Override
@Nonnull
public LootConditionType func_230419_b_()
{ {
return () -> INSTANCE; return TYPE;
} }
} }

View File

@@ -8,34 +8,34 @@ package dan200.computercraft.shared.data;
import com.google.gson.JsonDeserializationContext; import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonObject; import com.google.gson.JsonObject;
import com.google.gson.JsonSerializationContext; import com.google.gson.JsonSerializationContext;
import net.minecraft.util.ResourceLocation; import net.minecraft.loot.ILootSerializer;
import net.minecraft.world.storage.loot.conditions.ILootCondition; import net.minecraft.loot.LootConditionType;
import net.minecraft.loot.conditions.ILootCondition;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
public final class ConstantLootConditionSerializer<T extends ILootCondition> extends ILootCondition.AbstractSerializer<T> public final class ConstantLootConditionSerializer<T extends ILootCondition> implements ILootSerializer<T>
{ {
private final T instance; private final T instance;
private ConstantLootConditionSerializer( ResourceLocation id, Class<T> klass, T instance ) public ConstantLootConditionSerializer( T instance )
{ {
super( id, klass );
this.instance = instance; this.instance = instance;
} }
public static <T extends ILootCondition> ILootCondition.AbstractSerializer<T> of( ResourceLocation id, Class<T> klass, T instance ) public static <T extends ILootCondition> LootConditionType type( T condition )
{ {
return new ConstantLootConditionSerializer<>( id, klass, instance ); return new LootConditionType( new ConstantLootConditionSerializer<>( condition ) );
} }
@Override @Override
public void serialize( @Nonnull JsonObject json, @Nonnull T object, @Nonnull JsonSerializationContext context ) public void func_230424_a_( @Nonnull JsonObject json, @Nonnull T object, @Nonnull JsonSerializationContext context )
{ {
} }
@Nonnull @Nonnull
@Override @Override
public T deserialize( @Nonnull JsonObject json, @Nonnull JsonDeserializationContext context ) public T func_230423_a_( @Nonnull JsonObject json, @Nonnull JsonDeserializationContext context )
{ {
return instance; return instance;
} }

View File

@@ -6,11 +6,12 @@
package dan200.computercraft.shared.data; package dan200.computercraft.shared.data;
import dan200.computercraft.shared.computer.blocks.IComputerTile; import dan200.computercraft.shared.computer.blocks.IComputerTile;
import net.minecraft.loot.LootConditionType;
import net.minecraft.loot.LootContext;
import net.minecraft.loot.LootParameter;
import net.minecraft.loot.LootParameters;
import net.minecraft.loot.conditions.ILootCondition;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.storage.loot.LootContext;
import net.minecraft.world.storage.loot.LootParameter;
import net.minecraft.world.storage.loot.LootParameters;
import net.minecraft.world.storage.loot.conditions.ILootCondition;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.Collections; import java.util.Collections;
@@ -22,6 +23,8 @@ import java.util.Set;
public final class HasComputerIdLootCondition implements ILootCondition public final class HasComputerIdLootCondition implements ILootCondition
{ {
public static final HasComputerIdLootCondition INSTANCE = new HasComputerIdLootCondition(); public static final HasComputerIdLootCondition INSTANCE = new HasComputerIdLootCondition();
public static final LootConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE );
public static final IBuilder BUILDER = () -> INSTANCE;
private HasComputerIdLootCondition() private HasComputerIdLootCondition()
{ {
@@ -41,8 +44,10 @@ public final class HasComputerIdLootCondition implements ILootCondition
return Collections.singleton( LootParameters.BLOCK_ENTITY ); return Collections.singleton( LootParameters.BLOCK_ENTITY );
} }
public static IBuilder builder() @Override
@Nonnull
public LootConditionType func_230419_b_()
{ {
return () -> INSTANCE; return TYPE;
} }
} }

View File

@@ -7,10 +7,11 @@ package dan200.computercraft.shared.data;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.world.storage.loot.LootContext; import net.minecraft.loot.LootConditionType;
import net.minecraft.world.storage.loot.LootParameter; import net.minecraft.loot.LootContext;
import net.minecraft.world.storage.loot.LootParameters; import net.minecraft.loot.LootParameter;
import net.minecraft.world.storage.loot.conditions.ILootCondition; import net.minecraft.loot.LootParameters;
import net.minecraft.loot.conditions.ILootCondition;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.Collections; import java.util.Collections;
@@ -22,6 +23,8 @@ import java.util.Set;
public final class PlayerCreativeLootCondition implements ILootCondition public final class PlayerCreativeLootCondition implements ILootCondition
{ {
public static final PlayerCreativeLootCondition INSTANCE = new PlayerCreativeLootCondition(); public static final PlayerCreativeLootCondition INSTANCE = new PlayerCreativeLootCondition();
public static final LootConditionType TYPE = ConstantLootConditionSerializer.type( INSTANCE );
public static final IBuilder BUILDER = () -> INSTANCE;
private PlayerCreativeLootCondition() private PlayerCreativeLootCondition()
{ {
@@ -41,8 +44,10 @@ public final class PlayerCreativeLootCondition implements ILootCondition
return Collections.singleton( LootParameters.THIS_ENTITY ); return Collections.singleton( LootParameters.THIS_ENTITY );
} }
public static IBuilder builder() @Override
@Nonnull
public LootConditionType func_230419_b_()
{ {
return () -> INSTANCE; return TYPE;
} }
} }

View File

@@ -69,7 +69,7 @@ public class ItemDisk extends Item implements IMedia, IColouredItem
if( id >= 0 ) if( id >= 0 )
{ {
list.add( new TranslationTextComponent( "gui.computercraft.tooltip.disk_id", id ) list.add( new TranslationTextComponent( "gui.computercraft.tooltip.disk_id", id )
.applyTextStyle( TextFormatting.GRAY ) ); .func_240699_a_( TextFormatting.GRAY ) );
} }
} }
} }

View File

@@ -19,14 +19,14 @@ import net.minecraft.item.crafting.SpecialRecipe;
import net.minecraft.item.crafting.SpecialRecipeSerializer; import net.minecraft.item.crafting.SpecialRecipeSerializer;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.Tags;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
public class DiskRecipe extends SpecialRecipe public class DiskRecipe extends SpecialRecipe
{ {
private final Ingredient paper = Ingredient.fromItems( Items.PAPER ); private final Ingredient paper = Ingredient.fromItems( Items.PAPER );
private final Ingredient redstone = Ingredient.fromTag( Tags.Items.DUSTS_REDSTONE ); private final Ingredient redstone = Ingredient.fromItems( Items.REDSTONE );
// TODO: Ingredient.fromTag( Tags.Items.DUSTS_REDSTONE );
public DiskRecipe( ResourceLocation id ) public DiskRecipe( ResourceLocation id )
{ {

View File

@@ -13,7 +13,7 @@ import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.entity.player.ServerPlayerEntity; import net.minecraft.entity.player.ServerPlayerEntity;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.world.chunk.Chunk; import net.minecraft.world.chunk.Chunk;
import net.minecraftforge.fml.network.NetworkDirection; import net.minecraftforge.fml.network.NetworkDirection;
@@ -76,9 +76,9 @@ public final class NetworkHandler
network.sendToServer( packet ); network.sendToServer( packet );
} }
public static void sendToAllAround( NetworkMessage packet, World world, Vec3d pos, double range ) public static void sendToAllAround( NetworkMessage packet, World world, Vector3d pos, double range )
{ {
PacketDistributor.TargetPoint target = new PacketDistributor.TargetPoint( pos.x, pos.y, pos.z, range, world.getDimension().getType() ); PacketDistributor.TargetPoint target = new PacketDistributor.TargetPoint( pos.x, pos.y, pos.z, range, world.func_234923_W_() );
network.send( PacketDistributor.NEAR.with( () -> target ), packet ); network.send( PacketDistributor.NEAR.with( () -> target ), packet );
} }

View File

@@ -10,11 +10,14 @@ import net.minecraft.client.Minecraft;
import net.minecraft.network.PacketBuffer; import net.minecraft.network.PacketBuffer;
import net.minecraft.util.SoundEvent; import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.text.StringTextComponent;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.network.NetworkEvent; import net.minecraftforge.fml.network.NetworkEvent;
import net.minecraftforge.registries.ForgeRegistries;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.Objects;
/** /**
* Starts or stops a record on the client, depending on if {@link #soundEvent} is {@code null}. * Starts or stops a record on the client, depending on if {@link #soundEvent} is {@code null}.
@@ -49,7 +52,7 @@ public class PlayRecordClientMessage implements NetworkMessage
if( buf.readBoolean() ) if( buf.readBoolean() )
{ {
name = buf.readString( Short.MAX_VALUE ); name = buf.readString( Short.MAX_VALUE );
soundEvent = buf.readRegistryIdSafe( SoundEvent.class ); soundEvent = ForgeRegistries.SOUND_EVENTS.getValue( buf.readResourceLocation() );
} }
else else
{ {
@@ -70,7 +73,7 @@ public class PlayRecordClientMessage implements NetworkMessage
{ {
buf.writeBoolean( true ); buf.writeBoolean( true );
buf.writeString( name ); buf.writeString( name );
buf.writeRegistryId( soundEvent ); buf.writeResourceLocation( Objects.requireNonNull( soundEvent.getRegistryName(), "Sound is not registered" ) );
} }
} }
@@ -79,7 +82,7 @@ public class PlayRecordClientMessage implements NetworkMessage
public void handle( NetworkEvent.Context context ) public void handle( NetworkEvent.Context context )
{ {
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
mc.worldRenderer.playRecord( soundEvent, pos ); mc.worldRenderer.playRecord( soundEvent, pos, null );
if( name != null ) mc.ingameGUI.setRecordPlayingMessage( name ); if( name != null ) mc.ingameGUI.func_238451_a_( new StringTextComponent( name ) );
} }
} }

View File

@@ -24,7 +24,7 @@ public enum DiskDriveState implements IStringSerializable
@Override @Override
@Nonnull @Nonnull
public String getName() public String getString()
{ {
return name; return name;
} }

View File

@@ -122,10 +122,10 @@ public final class TileDiskDrive extends TileGeneric implements DefaultInventory
} }
@Override @Override
public void read( @Nonnull CompoundNBT nbt ) public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
{ {
super.read( nbt ); super.read( state, nbt );
customName = nbt.contains( NBT_NAME ) ? ITextComponent.Serializer.fromJson( nbt.getString( NBT_NAME ) ) : null; customName = nbt.contains( NBT_NAME ) ? ITextComponent.Serializer.func_240643_a_( nbt.getString( NBT_NAME ) ) : null;
if( nbt.contains( NBT_ITEM ) ) if( nbt.contains( NBT_ITEM ) )
{ {
CompoundNBT item = nbt.getCompound( NBT_ITEM ); CompoundNBT item = nbt.getCompound( NBT_ITEM );

View File

@@ -8,7 +8,7 @@ package dan200.computercraft.shared.peripheral.generic.data;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.state.IProperty; import net.minecraft.state.Property;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import java.util.HashMap; import java.util.HashMap;
@@ -22,9 +22,9 @@ public class BlockData
data.put( "name", DataHelpers.getId( state.getBlock() ) ); data.put( "name", DataHelpers.getId( state.getBlock() ) );
Map<Object, Object> stateTable = new HashMap<>(); Map<Object, Object> stateTable = new HashMap<>();
for( ImmutableMap.Entry<IProperty<?>, ? extends Comparable<?>> entry : state.getValues().entrySet() ) for( ImmutableMap.Entry<Property<?>, ? extends Comparable<?>> entry : state.getValues().entrySet() )
{ {
IProperty<?> property = entry.getKey(); Property<?> property = entry.getKey();
stateTable.put( property.getName(), getPropertyValue( property, entry.getValue() ) ); stateTable.put( property.getName(), getPropertyValue( property, entry.getValue() ) );
} }
data.put( "state", stateTable ); data.put( "state", stateTable );
@@ -34,7 +34,7 @@ public class BlockData
} }
@SuppressWarnings( { "unchecked", "rawtypes" } ) @SuppressWarnings( { "unchecked", "rawtypes" } )
private static Object getPropertyValue( IProperty property, Comparable value ) private static Object getPropertyValue( Property property, Comparable value )
{ {
if( value instanceof String || value instanceof Number || value instanceof Boolean ) return value; if( value instanceof String || value instanceof Number || value instanceof Boolean ) return value;
return property.getName( value ); return property.getName( value );

View File

@@ -7,8 +7,6 @@
package dan200.computercraft.shared.peripheral.generic.data; package dan200.computercraft.shared.peripheral.generic.data;
import com.google.gson.JsonParseException; import com.google.gson.JsonParseException;
import dan200.computercraft.ComputerCraft;
import dan200.computercraft.shared.util.NBTUtil;
import net.minecraft.enchantment.Enchantment; import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.item.EnchantedBookItem; import net.minecraft.item.EnchantedBookItem;
@@ -24,29 +22,13 @@ import javax.annotation.Nullable;
import java.util.*; import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* Data providers for items.
*
* We guard using {@link ComputerCraft#genericPeripheral} in several places, as advanced functionality should not be
* exposed for {@code turtle.getItemDetail} when generic peripehrals are disabled.
*/
public class ItemData public class ItemData
{ {
@Nonnull @Nonnull
public static <T extends Map<? super String, Object>> T fillBasicSafe( @Nonnull T data, @Nonnull ItemStack stack ) public static <T extends Map<? super String, Object>> T fillBasic( @Nonnull T data, @Nonnull ItemStack stack )
{ {
data.put( "name", DataHelpers.getId( stack.getItem() ) ); data.put( "name", DataHelpers.getId( stack.getItem() ) );
data.put( "count", stack.getCount() ); data.put( "count", stack.getCount() );
return data;
}
@Nonnull
public static <T extends Map<? super String, Object>> T fillBasic( @Nonnull T data, @Nonnull ItemStack stack )
{
fillBasicSafe( data, stack );
String hash = NBTUtil.getNBTHash( stack.getTag() );
if( hash != null ) data.put( "nbt", hash );
return data; return data;
} }
@@ -73,8 +55,6 @@ public class ItemData
data.put( "tags", DataHelpers.getTags( stack.getItem().getTags() ) ); data.put( "tags", DataHelpers.getTags( stack.getItem().getTags() ) );
if( !ComputerCraft.genericPeripheral ) return data;
CompoundNBT tag = stack.getTag(); CompoundNBT tag = stack.getTag();
if( tag != null && tag.contains( "display", Constants.NBT.TAG_COMPOUND ) ) if( tag != null && tag.contains( "display", Constants.NBT.TAG_COMPOUND ) )
{ {
@@ -113,7 +93,7 @@ public class ItemData
{ {
try try
{ {
return ITextComponent.Serializer.fromJson( x.getString() ); return ITextComponent.Serializer.func_240643_a_( x.getString() );
} }
catch( JsonParseException e ) catch( JsonParseException e )
{ {

View File

@@ -13,7 +13,7 @@ import dan200.computercraft.api.network.IPacketSender;
import dan200.computercraft.api.network.Packet; import dan200.computercraft.api.network.Packet;
import dan200.computercraft.api.peripheral.IComputerAccess; import dan200.computercraft.api.peripheral.IComputerAccess;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -171,7 +171,7 @@ public abstract class ModemPeripheral implements IPeripheral, IPacketSender, IPa
parseChannel( replyChannel ); parseChannel( replyChannel );
World world = getWorld(); World world = getWorld();
Vec3d position = getPosition(); Vector3d position = getPosition();
IPacketNetwork network = m_network; IPacketNetwork network = m_network;
if( world == null || position == null || network == null ) return; if( world == null || position == null || network == null ) return;

View File

@@ -15,7 +15,7 @@ import net.minecraft.block.BlockState;
import net.minecraft.block.IWaterLoggable; import net.minecraft.block.IWaterLoggable;
import net.minecraft.entity.LivingEntity; import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.fluid.IFluidState; import net.minecraft.fluid.FluidState;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.state.BooleanProperty; import net.minecraft.state.BooleanProperty;
@@ -100,7 +100,7 @@ public class BlockCable extends BlockGeneric implements IWaterLoggable
} }
@Override @Override
public boolean removedByPlayer( BlockState state, World world, BlockPos pos, PlayerEntity player, boolean willHarvest, IFluidState fluid ) public boolean removedByPlayer( BlockState state, World world, BlockPos pos, PlayerEntity player, boolean willHarvest, FluidState fluid )
{ {
if( state.get( CABLE ) && state.get( MODEM ).getFacing() != null ) if( state.get( CABLE ) && state.get( MODEM ).getFacing() != null )
{ {
@@ -180,7 +180,7 @@ public class BlockCable extends BlockGeneric implements IWaterLoggable
@Nonnull @Nonnull
@Override @Override
@Deprecated @Deprecated
public IFluidState getFluidState( @Nonnull BlockState state ) public FluidState getFluidState( @Nonnull BlockState state )
{ {
return getWaterloggedFluidState( state ); return getWaterloggedFluidState( state );
} }

View File

@@ -65,7 +65,7 @@ public enum CableModemVariant implements IStringSerializable
@Nonnull @Nonnull
@Override @Override
public String getName() public String getString()
{ {
return name; return name;
} }

View File

@@ -28,7 +28,7 @@ import net.minecraft.util.Direction;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
@@ -58,10 +58,10 @@ public class TileCable extends TileGeneric
@Nonnull @Nonnull
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos pos = getPos(); BlockPos pos = getPos();
return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); return new Vector3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
} }
@Override @Override
@@ -103,10 +103,10 @@ public class TileCable extends TileGeneric
@Nonnull @Nonnull
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos pos = getPos().offset( modemDirection ); BlockPos pos = getPos().offset( modemDirection );
return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); return new Vector3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
} }
@Nonnull @Nonnull
@@ -281,9 +281,9 @@ public class TileCable extends TileGeneric
} }
@Override @Override
public void read( @Nonnull CompoundNBT nbt ) public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
{ {
super.read( nbt ); super.read( state, nbt );
m_peripheralAccessAllowed = nbt.getBoolean( NBT_PERIPHERAL_ENABLED ); m_peripheralAccessAllowed = nbt.getBoolean( NBT_PERIPHERAL_ENABLED );
m_peripheral.read( nbt, "" ); m_peripheral.read( nbt, "" );
} }
@@ -422,12 +422,6 @@ public class TileCable extends TileGeneric
m_node.updatePeripherals( peripherals ); m_node.updatePeripherals( peripherals );
} }
@Override
public boolean canRenderBreaking()
{
return true;
}
@Nonnull @Nonnull
@Override @Override
public <T> LazyOptional<T> getCapability( @Nonnull Capability<T> capability, @Nullable Direction side ) public <T> LazyOptional<T> getCapability( @Nonnull Capability<T> capability, @Nullable Direction side )

View File

@@ -26,7 +26,7 @@ import net.minecraft.util.Direction;
import net.minecraft.util.Hand; import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TranslationTextComponent;
import net.minecraft.world.World; import net.minecraft.world.World;
@@ -85,10 +85,10 @@ public class TileWiredModemFull extends TileGeneric
@Nonnull @Nonnull
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos pos = m_entity.getPos(); BlockPos pos = m_entity.getPos();
return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); return new Vector3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
} }
} }
@@ -217,17 +217,17 @@ public class TileWiredModemFull extends TileGeneric
StringTextComponent base = new StringTextComponent( "" ); StringTextComponent base = new StringTextComponent( "" );
for( int i = 0; i < names.size(); i++ ) for( int i = 0; i < names.size(); i++ )
{ {
if( i > 0 ) base.appendText( ", " ); if( i > 0 ) base.func_240702_b_( ", " );
base.appendSibling( CommandCopy.createCopyText( names.get( i ) ) ); base.func_230529_a_( CommandCopy.createCopyText( names.get( i ) ) );
} }
player.sendStatusMessage( new TranslationTextComponent( kind, base ), false ); player.sendStatusMessage( new TranslationTextComponent( kind, base ), false );
} }
@Override @Override
public void read( @Nonnull CompoundNBT nbt ) public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
{ {
super.read( nbt ); super.read( state, nbt );
m_peripheralAccessAllowed = nbt.getBoolean( NBT_PERIPHERAL_ENABLED ); m_peripheralAccessAllowed = nbt.getBoolean( NBT_PERIPHERAL_ENABLED );
for( int i = 0; i < m_peripherals.length; i++ ) m_peripherals[i].read( nbt, Integer.toString( i ) ); for( int i = 0; i < m_peripherals.length; i++ ) m_peripherals[i].read( nbt, Integer.toString( i ) );
} }
@@ -399,10 +399,10 @@ public class TileWiredModemFull extends TileGeneric
@Nonnull @Nonnull
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos pos = getPos().offset( side ); BlockPos pos = getPos().offset( side );
return new Vec3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 ); return new Vector3d( pos.getX() + 0.5, pos.getY() + 0.5, pos.getZ() + 0.5 );
} }
@Nonnull @Nonnull

View File

@@ -10,7 +10,7 @@ import dan200.computercraft.shared.peripheral.modem.ModemShapes;
import net.minecraft.block.Block; import net.minecraft.block.Block;
import net.minecraft.block.BlockState; import net.minecraft.block.BlockState;
import net.minecraft.block.IWaterLoggable; import net.minecraft.block.IWaterLoggable;
import net.minecraft.fluid.IFluidState; import net.minecraft.fluid.FluidState;
import net.minecraft.item.BlockItemUseContext; import net.minecraft.item.BlockItemUseContext;
import net.minecraft.state.BooleanProperty; import net.minecraft.state.BooleanProperty;
import net.minecraft.state.DirectionProperty; import net.minecraft.state.DirectionProperty;
@@ -62,7 +62,7 @@ public class BlockWirelessModem extends BlockGeneric implements IWaterLoggable
@Nonnull @Nonnull
@Override @Override
@Deprecated @Deprecated
public IFluidState getFluidState( @Nonnull BlockState state ) public FluidState getFluidState( @Nonnull BlockState state )
{ {
return getWaterloggedFluidState( state ); return getWaterloggedFluidState( state );
} }

View File

@@ -15,7 +15,7 @@ import net.minecraft.block.BlockState;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
@@ -46,10 +46,10 @@ public class TileWirelessModem extends TileGeneric
@Nonnull @Nonnull
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos pos = entity.getPos().offset( entity.modemDirection ); BlockPos pos = entity.getPos().offset( entity.modemDirection );
return new Vec3d( pos.getX(), pos.getY(), pos.getZ() ); return new Vector3d( pos.getX(), pos.getY(), pos.getZ() );
} }
@Override @Override

View File

@@ -9,7 +9,7 @@ import dan200.computercraft.ComputerCraft;
import dan200.computercraft.api.network.IPacketNetwork; import dan200.computercraft.api.network.IPacketNetwork;
import dan200.computercraft.shared.peripheral.modem.ModemPeripheral; import dan200.computercraft.shared.peripheral.modem.ModemPeripheral;
import dan200.computercraft.shared.peripheral.modem.ModemState; import dan200.computercraft.shared.peripheral.modem.ModemState;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
public abstract class WirelessModemPeripheral extends ModemPeripheral public abstract class WirelessModemPeripheral extends ModemPeripheral
@@ -40,7 +40,7 @@ public abstract class WirelessModemPeripheral extends ModemPeripheral
World world = getWorld(); World world = getWorld();
if( world != null ) if( world != null )
{ {
Vec3d position = getPosition(); Vector3d position = getPosition();
double minRange = ComputerCraft.modemRange; double minRange = ComputerCraft.modemRange;
double maxRange = ComputerCraft.modemHighAltitudeRange; double maxRange = ComputerCraft.modemHighAltitudeRange;
if( world.isRaining() && world.isThundering() ) if( world.isRaining() && world.isThundering() )

View File

@@ -69,7 +69,7 @@ public final class ClientMonitor extends ClientTerminal
GL15.glBufferData( GL31.GL_TEXTURE_BUFFER, 0, GL15.GL_STATIC_DRAW ); GL15.glBufferData( GL31.GL_TEXTURE_BUFFER, 0, GL15.GL_STATIC_DRAW );
tboTexture = GlStateManager.genTexture(); tboTexture = GlStateManager.genTexture();
GL11.glBindTexture( GL31.GL_TEXTURE_BUFFER, tboTexture ); GL11.glBindTexture( GL31.GL_TEXTURE_BUFFER, tboTexture );
GL31.glTexBuffer( GL31.GL_TEXTURE_BUFFER, GL30.GL_R8UI, tboBuffer ); GL31.glTexBuffer( GL31.GL_TEXTURE_BUFFER, GL30.GL_R8, tboBuffer );
GL11.glBindTexture( GL31.GL_TEXTURE_BUFFER, 0 ); GL11.glBindTexture( GL31.GL_TEXTURE_BUFFER, 0 );
GlStateManager.bindBuffer( GL31.GL_TEXTURE_BUFFER, 0 ); GlStateManager.bindBuffer( GL31.GL_TEXTURE_BUFFER, 0 );

View File

@@ -59,7 +59,7 @@ public enum MonitorEdgeState implements IStringSerializable
@Nonnull @Nonnull
@Override @Override
public String getName() public String getString()
{ {
return name; return name;
} }

View File

@@ -14,6 +14,7 @@ import dan200.computercraft.shared.common.TileGeneric;
import dan200.computercraft.shared.network.client.TerminalState; import dan200.computercraft.shared.network.client.TerminalState;
import dan200.computercraft.shared.util.CapabilityUtil; import dan200.computercraft.shared.util.CapabilityUtil;
import dan200.computercraft.shared.util.TickScheduler; import dan200.computercraft.shared.util.TickScheduler;
import net.minecraft.block.BlockState;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntity;
@@ -134,13 +135,14 @@ public class TileMonitor extends TileGeneric
} }
@Override @Override
public void read( @Nonnull CompoundNBT tag ) public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
{ {
super.read( tag ); super.read( state, nbt );
m_xIndex = tag.getInt( NBT_X );
m_yIndex = tag.getInt( NBT_Y ); m_xIndex = nbt.getInt( NBT_X );
m_width = tag.getInt( NBT_WIDTH ); m_yIndex = nbt.getInt( NBT_Y );
m_height = tag.getInt( NBT_HEIGHT ); m_width = nbt.getInt( NBT_WIDTH );
m_height = nbt.getInt( NBT_HEIGHT );
} }
@Override @Override

View File

@@ -13,6 +13,7 @@ import net.minecraft.inventory.IInventory;
import net.minecraft.inventory.Inventory; import net.minecraft.inventory.Inventory;
import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.Container;
import net.minecraft.inventory.container.Slot; import net.minecraft.inventory.container.Slot;
import net.minecraft.item.DyeItem;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.IIntArray; import net.minecraft.util.IIntArray;
import net.minecraft.util.IntArray; import net.minecraft.util.IntArray;
@@ -94,7 +95,7 @@ public class ContainerPrinter extends Container
else else
{ {
// Transfer from inventory to printer // Transfer from inventory to printer
if( TilePrinter.isInk( stack ) ) if( stack.getItem() instanceof DyeItem )
{ {
if( !mergeItemStack( stack, 0, 1, false ) ) return ItemStack.EMPTY; if( !mergeItemStack( stack, 0, 1, false ) ) return ItemStack.EMPTY;
} }

View File

@@ -46,8 +46,8 @@ public class PrinterPeripheral implements IPeripheral
* Writes text to the current page. * Writes text to the current page.
* *
* @param arguments The values to write to the page. * @param arguments The values to write to the page.
* @cc.tparam string|number ... The values to write to the page.
* @throws LuaException If any values couldn't be converted to a string, or if no page is started. * @throws LuaException If any values couldn't be converted to a string, or if no page is started.
* @cc.tparam string|number ... The values to write to the page.
*/ */
@LuaFunction @LuaFunction
public final void write( IArguments arguments ) throws LuaException public final void write( IArguments arguments ) throws LuaException
@@ -62,9 +62,9 @@ public class PrinterPeripheral implements IPeripheral
* Returns the current position of the cursor on the page. * Returns the current position of the cursor on the page.
* *
* @return The position of the cursor. * @return The position of the cursor.
* @throws LuaException If a page isn't being printed.
* @cc.treturn number The X position of the cursor. * @cc.treturn number The X position of the cursor.
* @cc.treturn number The Y position of the cursor. * @cc.treturn number The Y position of the cursor.
* @throws LuaException If a page isn't being printed.
*/ */
@LuaFunction @LuaFunction
public final Object[] getCursorPos() throws LuaException public final Object[] getCursorPos() throws LuaException
@@ -93,9 +93,9 @@ public class PrinterPeripheral implements IPeripheral
* Returns the size of the current page. * Returns the size of the current page.
* *
* @return The size of the page. * @return The size of the page.
* @throws LuaException If a page isn't being printed.
* @cc.treturn number The width of the page. * @cc.treturn number The width of the page.
* @cc.treturn number The height of the page. * @cc.treturn number The height of the page.
* @throws LuaException If a page isn't being printed.
*/ */
@LuaFunction @LuaFunction
public final Object[] getPageSize() throws LuaException public final Object[] getPageSize() throws LuaException

View File

@@ -22,7 +22,7 @@ import net.minecraft.nbt.CompoundNBT;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.*; import net.minecraft.util.*;
import net.minecraft.util.math.BlockRayTraceResult; import net.minecraft.util.math.BlockRayTraceResult;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TranslationTextComponent; import net.minecraft.util.text.TranslationTextComponent;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
@@ -91,11 +91,11 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent
} }
@Override @Override
public void read( @Nonnull CompoundNBT nbt ) public void read( @Nonnull BlockState state, @Nonnull CompoundNBT nbt )
{ {
super.read( nbt ); super.read( state, nbt );
customName = nbt.contains( NBT_NAME ) ? ITextComponent.Serializer.fromJson( nbt.getString( NBT_NAME ) ) : null; customName = nbt.contains( NBT_NAME ) ? ITextComponent.Serializer.func_240643_a_( nbt.getString( NBT_NAME ) ) : null;
// Read page // Read page
synchronized( m_page ) synchronized( m_page )
@@ -300,9 +300,9 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent
} }
} }
static boolean isInk( @Nonnull ItemStack stack ) private static boolean isInk( @Nonnull ItemStack stack )
{ {
return ColourUtils.getStackColour( stack ) != null; return stack.getItem() instanceof DyeItem;
} }
private static boolean isPaper( @Nonnull ItemStack stack ) private static boolean isPaper( @Nonnull ItemStack stack )
@@ -321,8 +321,7 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent
private boolean inputPage() private boolean inputPage()
{ {
ItemStack inkStack = m_inventory.get( 0 ); ItemStack inkStack = m_inventory.get( 0 );
DyeColor dye = ColourUtils.getStackColour( inkStack ); if( !isInk( inkStack ) ) return false;
if( dye == null ) return false;
for( int i = 1; i < 7; i++ ) for( int i = 1; i < 7; i++ )
{ {
@@ -330,7 +329,8 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent
if( paperStack.isEmpty() || !isPaper( paperStack ) ) continue; if( paperStack.isEmpty() || !isPaper( paperStack ) ) continue;
// Setup the new page // Setup the new page
m_page.setTextColour( dye.getId() ); DyeColor dye = ColourUtils.getStackColour( inkStack );
m_page.setTextColour( dye != null ? dye.getId() : 15 );
m_page.clear(); m_page.clear();
if( paperStack.getItem() instanceof ItemPrintout ) if( paperStack.getItem() instanceof ItemPrintout )
@@ -403,7 +403,7 @@ public final class TilePrinter extends TileGeneric implements DefaultSidedInvent
setInventorySlotContents( i, ItemStack.EMPTY ); setInventorySlotContents( i, ItemStack.EMPTY );
// Spawn the item in the world // Spawn the item in the world
WorldUtil.dropItemStack( stack, getWorld(), new Vec3d( getPos() ).add( 0.5, 0.75, 0.5 ) ); WorldUtil.dropItemStack( stack, getWorld(), Vector3d.func_237491_b_( getPos() ).add( 0.5, 0.75, 0.5 ) );
} }
} }
} }

View File

@@ -16,7 +16,7 @@ import net.minecraft.state.properties.NoteBlockInstrument;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.util.ResourceLocationException; import net.minecraft.util.ResourceLocationException;
import net.minecraft.util.SoundCategory; import net.minecraft.util.SoundCategory;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -44,7 +44,7 @@ public abstract class SpeakerPeripheral implements IPeripheral
public abstract World getWorld(); public abstract World getWorld();
public abstract Vec3d getPosition(); public abstract Vector3d getPosition();
public boolean madeSound( long ticks ) public boolean madeSound( long ticks )
{ {
@@ -66,9 +66,9 @@ public abstract class SpeakerPeripheral implements IPeripheral
* with an optional volume and speed multiplier, and plays it through the speaker. * with an optional volume and speed multiplier, and plays it through the speaker.
* *
* @param context The Lua context * @param context The Lua context
* @param name The name of the sound to play. * @param name The name of the sound to play.
* @param volumeA The volume to play the sound at, from 0.0 to 3.0. Defaults to 1.0. * @param volumeA The volume to play the sound at, from 0.0 to 3.0. Defaults to 1.0.
* @param pitchA The speed to play the sound at, from 0.5 to 2.0. Defaults to 1.0. * @param pitchA The speed to play the sound at, from 0.5 to 2.0. Defaults to 1.0.
* @return Whether the sound could be played. * @return Whether the sound could be played.
* @throws LuaException If the sound name couldn't be decoded. * @throws LuaException If the sound name couldn't be decoded.
*/ */
@@ -102,9 +102,9 @@ public abstract class SpeakerPeripheral implements IPeripheral
* and 6 and 18 map to C. * and 6 and 18 map to C.
* *
* @param context The Lua context * @param context The Lua context
* @param name The name of the note to play. * @param name The name of the note to play.
* @param volumeA The volume to play the note at, from 0.0 to 3.0. Defaults to 1.0. * @param volumeA The volume to play the note at, from 0.0 to 3.0. Defaults to 1.0.
* @param pitchA The pitch to play the note at in semitones, from 0 to 24. Defaults to 12. * @param pitchA The pitch to play the note at in semitones, from 0 to 24. Defaults to 12.
* @return Whether the note could be played. * @return Whether the note could be played.
* @throws LuaException If the instrument doesn't exist. * @throws LuaException If the instrument doesn't exist.
*/ */
@@ -117,7 +117,7 @@ public abstract class SpeakerPeripheral implements IPeripheral
NoteBlockInstrument instrument = null; NoteBlockInstrument instrument = null;
for( NoteBlockInstrument testInstrument : NoteBlockInstrument.values() ) for( NoteBlockInstrument testInstrument : NoteBlockInstrument.values() )
{ {
if( testInstrument.getName().equalsIgnoreCase( name ) ) if( testInstrument.getString().equalsIgnoreCase( name ) )
{ {
instrument = testInstrument; instrument = testInstrument;
break; break;
@@ -144,7 +144,7 @@ public abstract class SpeakerPeripheral implements IPeripheral
} }
World world = getWorld(); World world = getWorld();
Vec3d pos = getPosition(); Vector3d pos = getPosition();
context.issueMainThreadTask( () -> { context.issueMainThreadTask( () -> {
MinecraftServer server = world.getServer(); MinecraftServer server = world.getServer();
@@ -152,7 +152,7 @@ public abstract class SpeakerPeripheral implements IPeripheral
float adjVolume = Math.min( volume, 3.0f ); float adjVolume = Math.min( volume, 3.0f );
server.getPlayerList().sendToAllNearExcept( server.getPlayerList().sendToAllNearExcept(
null, pos.x, pos.y, pos.z, adjVolume > 1.0f ? 16 * adjVolume : 16.0, world.dimension.getType(), null, pos.x, pos.y, pos.z, adjVolume > 1.0f ? 16 * adjVolume : 16.0, world.func_234923_W_(),
new SPlaySoundPacket( name, SoundCategory.RECORDS, pos, adjVolume, pitch ) new SPlaySoundPacket( name, SoundCategory.RECORDS, pos, adjVolume, pitch )
); );
return null; return null;

View File

@@ -12,7 +12,7 @@ import net.minecraft.tileentity.ITickableTileEntity;
import net.minecraft.tileentity.TileEntityType; import net.minecraft.tileentity.TileEntityType;
import net.minecraft.util.Direction; import net.minecraft.util.Direction;
import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
@@ -77,10 +77,10 @@ public class TileSpeaker extends TileGeneric implements ITickableTileEntity
} }
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
BlockPos pos = speaker.getPos(); BlockPos pos = speaker.getPos();
return new Vec3d( pos.getX(), pos.getY(), pos.getZ() ); return new Vector3d( pos.getX(), pos.getY(), pos.getZ() );
} }
@Override @Override

View File

@@ -163,7 +163,7 @@ public class PocketServerComputer extends ServerComputer implements IPocketAcces
if( entity != null ) if( entity != null )
{ {
setWorld( entity.getEntityWorld() ); setWorld( entity.getEntityWorld() );
setPosition( entity.getPosition() ); setPosition( entity.func_233580_cy_() );
} }
// If a new entity has picked it up then rebroadcast the terminal to them // If a new entity has picked it up then rebroadcast the terminal to them

View File

@@ -27,12 +27,14 @@ import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.IInventory; import net.minecraft.inventory.IInventory;
import net.minecraft.item.IItemPropertyGetter;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.ItemGroup; import net.minecraft.item.ItemGroup;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT; import net.minecraft.nbt.CompoundNBT;
import net.minecraft.util.*; import net.minecraft.util.ActionResult;
import net.minecraft.util.ActionResultType;
import net.minecraft.util.Hand;
import net.minecraft.util.NonNullList;
import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent; import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.TextFormatting;
@@ -60,8 +62,6 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I
{ {
super( settings ); super( settings );
this.family = family; this.family = family;
addPropertyOverride( new ResourceLocation( ComputerCraft.MOD_ID, "state" ), COMPUTER_STATE );
addPropertyOverride( new ResourceLocation( ComputerCraft.MOD_ID, "coloured" ), COMPUTER_COLOURED );
} }
public ItemStack create( int id, String label, int colour, IPocketUpgrade upgrade ) public ItemStack create( int id, String label, int colour, IPocketUpgrade upgrade )
@@ -190,7 +190,7 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I
if( id >= 0 ) if( id >= 0 )
{ {
list.add( new TranslationTextComponent( "gui.computercraft.tooltip.computer_id", id ) list.add( new TranslationTextComponent( "gui.computercraft.tooltip.computer_id", id )
.applyTextStyle( TextFormatting.GRAY ) ); .func_240699_a_( TextFormatting.GRAY ) );
} }
} }
} }
@@ -408,7 +408,4 @@ public class ItemPocketComputer extends Item implements IComputerItem, IMedia, I
{ {
return stack.getOrCreateChildTag( NBT_UPGRADE_INFO ); return stack.getOrCreateChildTag( NBT_UPGRADE_INFO );
} }
private static final IItemPropertyGetter COMPUTER_STATE = ( stack, world, player ) -> getState( stack ).ordinal();
private static final IItemPropertyGetter COMPUTER_COLOURED = ( stack, world, player ) -> IColouredItem.getColourBasic( stack ) != -1 ? 1 : 0;
} }

View File

@@ -8,7 +8,7 @@ package dan200.computercraft.shared.pocket.peripherals;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.shared.peripheral.modem.ModemState; import dan200.computercraft.shared.peripheral.modem.ModemState;
import dan200.computercraft.shared.peripheral.modem.wireless.WirelessModemPeripheral; import dan200.computercraft.shared.peripheral.modem.wireless.WirelessModemPeripheral;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
@@ -16,14 +16,14 @@ import javax.annotation.Nonnull;
public class PocketModemPeripheral extends WirelessModemPeripheral public class PocketModemPeripheral extends WirelessModemPeripheral
{ {
private World world = null; private World world = null;
private Vec3d position = Vec3d.ZERO; private Vector3d position = Vector3d.ZERO;
public PocketModemPeripheral( boolean advanced ) public PocketModemPeripheral( boolean advanced )
{ {
super( new ModemState(), advanced ); super( new ModemState(), advanced );
} }
void setLocation( World world, Vec3d position ) void setLocation( World world, Vector3d position )
{ {
this.position = position; this.position = position;
this.world = world; this.world = world;
@@ -38,7 +38,7 @@ public class PocketModemPeripheral extends WirelessModemPeripheral
@Nonnull @Nonnull
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
return position; return position;
} }

View File

@@ -7,15 +7,15 @@ package dan200.computercraft.shared.pocket.peripherals;
import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.api.peripheral.IPeripheral;
import dan200.computercraft.shared.peripheral.speaker.SpeakerPeripheral; import dan200.computercraft.shared.peripheral.speaker.SpeakerPeripheral;
import net.minecraft.util.math.Vec3d; import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World; import net.minecraft.world.World;
public class PocketSpeakerPeripheral extends SpeakerPeripheral public class PocketSpeakerPeripheral extends SpeakerPeripheral
{ {
private World world = null; private World world = null;
private Vec3d position = Vec3d.ZERO; private Vector3d position = Vector3d.ZERO;
void setLocation( World world, Vec3d position ) void setLocation( World world, Vector3d position )
{ {
this.position = position; this.position = position;
this.world = world; this.world = world;
@@ -28,7 +28,7 @@ public class PocketSpeakerPeripheral extends SpeakerPeripheral
} }
@Override @Override
public Vec3d getPosition() public Vector3d getPosition()
{ {
return world != null ? position : null; return world != null ? position : null;
} }

View File

@@ -19,7 +19,6 @@ import dan200.computercraft.shared.computer.core.IComputer;
import dan200.computercraft.shared.computer.core.IContainerComputer; import dan200.computercraft.shared.computer.core.IContainerComputer;
import dan200.computercraft.shared.computer.core.ServerComputer; import dan200.computercraft.shared.computer.core.ServerComputer;
import dan200.computercraft.shared.data.BlockNamedEntityLootCondition; import dan200.computercraft.shared.data.BlockNamedEntityLootCondition;
import dan200.computercraft.shared.data.ConstantLootConditionSerializer;
import dan200.computercraft.shared.data.HasComputerIdLootCondition; import dan200.computercraft.shared.data.HasComputerIdLootCondition;
import dan200.computercraft.shared.data.PlayerCreativeLootCondition; import dan200.computercraft.shared.data.PlayerCreativeLootCondition;
import dan200.computercraft.shared.media.items.RecordMedia; import dan200.computercraft.shared.media.items.RecordMedia;
@@ -29,12 +28,9 @@ import dan200.computercraft.shared.util.NullStorage;
import net.minecraft.inventory.container.Container; import net.minecraft.inventory.container.Container;
import net.minecraft.item.Item; import net.minecraft.item.Item;
import net.minecraft.item.MusicDiscItem; import net.minecraft.item.MusicDiscItem;
import net.minecraft.loot.*;
import net.minecraft.util.ResourceLocation; import net.minecraft.util.ResourceLocation;
import net.minecraft.world.storage.loot.ConstantRange; import net.minecraft.util.registry.Registry;
import net.minecraft.world.storage.loot.LootPool;
import net.minecraft.world.storage.loot.LootTables;
import net.minecraft.world.storage.loot.TableLootEntry;
import net.minecraft.world.storage.loot.conditions.LootConditionManager;
import net.minecraftforge.common.capabilities.CapabilityManager; import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.event.LootTableLoadEvent; import net.minecraftforge.event.LootTableLoadEvent;
import net.minecraftforge.event.TickEvent; import net.minecraftforge.event.TickEvent;
@@ -68,23 +64,14 @@ public final class ComputerCraftProxyCommon
public static void registerLoot() public static void registerLoot()
{ {
LootConditionManager.registerCondition( ConstantLootConditionSerializer.of( registerCondition( "block_named", BlockNamedEntityLootCondition.TYPE );
new ResourceLocation( ComputerCraft.MOD_ID, "block_named" ), registerCondition( "player_creative", PlayerCreativeLootCondition.TYPE );
BlockNamedEntityLootCondition.class, registerCondition( "has_id", HasComputerIdLootCondition.TYPE );
BlockNamedEntityLootCondition.INSTANCE }
) );
LootConditionManager.registerCondition( ConstantLootConditionSerializer.of( private static void registerCondition( String name, LootConditionType serializer )
new ResourceLocation( ComputerCraft.MOD_ID, "player_creative" ), {
PlayerCreativeLootCondition.class, Registry.register( Registry.field_239704_ba_, new ResourceLocation( ComputerCraft.MOD_ID, name ), serializer );
PlayerCreativeLootCondition.INSTANCE
) );
LootConditionManager.registerCondition( ConstantLootConditionSerializer.of(
new ResourceLocation( ComputerCraft.MOD_ID, "has_id" ),
HasComputerIdLootCondition.class,
HasComputerIdLootCondition.INSTANCE
) );
} }
private static void registerProviders() private static void registerProviders()

View File

@@ -605,7 +605,7 @@ public class TurtleAPI implements ILuaAPI
Map<String, Object> table = detailed Map<String, Object> table = detailed
? ItemData.fill( new HashMap<>(), stack ) ? ItemData.fill( new HashMap<>(), stack )
: ItemData.fillBasicSafe( new HashMap<>(), stack ); : ItemData.fillBasic( new HashMap<>(), stack );
TurtleActionEvent event = new TurtleInspectItemEvent( turtle, stack, table, detailed ); TurtleActionEvent event = new TurtleInspectItemEvent( turtle, stack, table, detailed );
if( MinecraftForge.EVENT_BUS.post( event ) ) return new Object[] { false, event.getFailureMessage() }; if( MinecraftForge.EVENT_BUS.post( event ) ) return new Object[] { false, event.getFailureMessage() };

Some files were not shown because too many files have changed in this diff Show More