Compare commits

..
416 Commits
Author SHA1 Message Date
SizableShrimp a1eb26aee2 [1.13.x] Update Installer to 2.1.+ (#8288)
* Update Installer to 2.1.+

Signed-off-by: SizableShrimp <[email protected]>

* Update references of files.mcf.net/maven to maven.mcf.net

Signed-off-by: SizableShrimp <[email protected]>
2021-12-12 03:33:15 +10:30
Marc Hermans 638bea3b9c Patch the jenkinsfile so it publishes using the correct credentials provided by Jenkins. (#8276) 2021-12-11 00:23:30 +10:30
Marc Hermans 05cb868bb2 [CVE-2021-44228]: Update Log4J to fix the security issue inside it. (#8273) 2021-12-10 22:56:02 +10:30
Ben Staddon 54d0bafa12 Pass tick counter to custom render handlers (#5744) 2019-07-08 19:46:50 -07:00
LexManos d3e8804dbf Include new library in installer json.
Change order of versions on main menu, to prevent overlap with default window size.
Fix Forge update not displaying version info.
2019-05-27 19:13:55 -07:00
LexManos c509cac02b Fix vanilla structures loosing valid flags, And fix error placement for unsaveable structures. 2019-05-27 13:49:15 -07:00
LexManos 4b5bf760ec Fix tall grass not dropping seeds. Closes #5675 2019-05-27 13:46:19 -07:00
cpw c57c6213ea Enhance crash reports and logging to capture transformers on stack trace elements.
Moved log4j2.xml file to the launcher source set, so it loads first in the client.

Signed-off-by: cpw <[email protected]>
2019-05-27 00:00:45 -04:00
tterrag fb30820e2b Remove cache eviction for model data, optimize 2019-05-23 21:49:39 -04:00
Philipp 61b612c88a dimesnion -> dimension typos (#5684) 2019-05-21 15:43:45 -04:00
ben-mkiv d3edc9dcdc FENCES_NETHER_BRRICK => FENCES_NETHER_BRICK (#5681) 2019-05-21 15:43:45 -04:00
Hugman ba2485b807 GEMS_QUARRTZ -> GEMS_QUARTZ (#5635) 2019-05-21 15:43:45 -04:00
Cadiboo 60c6635af5 Small comment typo fixes for ObfuscationReflectionHelper (#5583) 2019-05-21 15:43:45 -04:00
James Mitchell 9c5134fb6b Fix MC-146650 GuiContainer#keyPressed to return the correct key handled boolean (#5367) 2019-05-21 11:00:47 -07:00
LexManos eae0858de6 Fix build script producing duplicated eclipse source folders.
Fix not including userdev source in sources jar.
Update license header of files that need it.
Delete patches_old folders. Most are unneeded in 1.13+ as the systems they effected were changed significantly. Any that need to be readdressed can be done as PRs.
2019-05-13 19:11:24 -07:00
Vincent Lee d7949d5316 Fix caps not being visible on old player during clone event (#5728) 2019-05-13 09:57:50 -07:00
LexManos 8c44d6d4cb Fix vanilla bug in writing structure templates with multiple palettes. 2019-05-12 23:40:54 -07:00
Vincent Lee 049fae5c65 Add support for vanilla recipes having nbt on result (#5710) Fix #5663 2019-05-12 21:44:46 -07:00
tterrag 41f8459a41 Fix modded TEs not being removed on block change 2019-05-12 15:05:33 -04:00
cpw 5cd82f16f2 Fix #5735 by pushing new build. Shutdown Forge eventbus when errors occur. Closes #5711
Also, improve logging so warnings, errors and fatals are always shown, regardless of marker.

Signed-off-by: cpw <[email protected]>
2019-05-12 13:07:29 -04:00
OhYea777 444ba7a7d5 Update 'build.gradle' to fix run configs for launching forge 2019-05-12 12:51:18 -04:00
tterrag dcd5f1d711 Remove patch causing TEs to be removed on state change 2019-05-11 23:30:46 -04:00
tterrag 18ce494cba Fix default IUnbakedModel bake method using wrong format 2019-05-11 23:22:46 -04:00
tterrag 9e39570d49 Add ModelDataTest to test mods.toml 2019-05-11 23:22:24 -04:00
cpw 6a1337aa92 Updated a couple of libraries. Fixed bug where modid could be in toml but
not found during loading, yet game continued to load.

Signed-off-by: cpw <[email protected]>
2019-05-11 20:47:42 -04:00
tterrag 605c4a0adf Add test mods run configs 2019-05-11 18:58:45 -04:00
tterrag 7c90d9f3e8 Better handle errors from eclipse compiled (non-compiling) bytecode 2019-05-11 18:58:45 -04:00
tterrag 01a0674490 Finish model loader debug mod 2019-05-11 18:58:45 -04:00
tterrag e482793f69 Comment out test Mod/EventBusSubscriber annotations, fix up ModelLoaderRegistryTest 2019-05-11 18:58:45 -04:00
tterrag de14670d4d Fix BakedQuadRetextured calling old BakedQuad ctor 2019-05-11 16:36:16 -04:00
tterrag 9209c3cbfe Add new system for model data, replacing extended states (#5564) 2019-05-09 02:10:38 -04:00
LexManos a7204b5cd3 Bump ForgeSPI version, and add support for DistCleaner stripping interfaces from classes.
Add more detail to VersionChecker log info.
2019-05-06 15:52:12 -07:00
tterrag 616416569b Add explicit return type checks for extensible enums, fix exc 2019-04-25 19:51:20 -04:00
tterrag cab1b9716c Fix EnumRarity, make sure extensible enums have at least one factory candidate 2019-04-25 19:38:03 -04:00
tterrag bda3f1b7c6 Make EnumRarity extensible 2019-04-25 19:29:19 -04:00
tterrag 416bf9e3bf Allow loading json constants outside of _constants 2019-04-25 19:22:43 -04:00
tterrag 102e0095a7 Update skipped_commits.md 2019-04-25 18:32:06 -04:00
Ben Staddon 1fcfd54584 Fix some vertex format changes not being handled correctly (#5368) 2019-04-25 18:31:17 -04:00
Ben Staddon 441a9c9024 Transform vertex normals as well as positions when generating quads (#5242) 2019-04-25 18:29:12 -04:00
Robert WC Seifert f68fdcf703 Fix for SidedInvWrapper isItemValid using wrong slot (#5642) 2019-04-25 18:20:42 -04:00
tterrag d8137f7bcf Add comment to vanilla bugfix, update skipped_commits.md 2019-04-25 15:59:08 -04:00
tterrag 42c27b8845 Change default username to 'Dev', add ability to replace '#' with randomized numbers 2019-04-25 15:52:02 -04:00
tterrag 8408539f1c Fix MC-128441: cross-dimensional teleporting does not work 2019-04-25 15:18:40 -04:00
Ben Staddon 1f0467b864 Add Forge dimension-changing hooks to spectator handling code (#5212) 2019-04-25 15:08:15 -04:00
ichttt 1aae18d4bc Minor performace improvement when building chunks and rendering blocks (#5286) 2019-04-24 13:20:19 -04:00
Ben Staddon 45902676fd Catch json parsing errors from constants/factories files (#5258) 2019-04-24 13:12:03 -04:00
Ben Staddon 931105123e Allow custom DataSerializers to be registered safely (#5245) 2019-04-24 13:05:12 -04:00
tterrag cf35019d07 Further clean up Constants, and add two new BlockFlags 2019-04-24 12:58:09 -04:00
tterrag c636f6edd6 Remove unnecessary patch 2019-04-24 02:13:17 -04:00
tterrag 58b28569e2 Update skipped_commits.md 2019-04-24 01:34:43 -04:00
Pokechu22 73bb013b25 Fail fast when null is used with setTag instead of crashing in writeEntry (#5257) 2019-04-24 01:32:45 -04:00
tterrag d6da893c0c Update Constants for 1.13 2019-04-24 01:26:24 -04:00
Wyn Price 47a7d8e2b7 Added more Constants (#5323) 2019-04-24 01:25:21 -04:00
Thanh-Phuong cb0cf2f04f Add a few events pertaining to villages (#5302) 2019-04-24 01:07:02 -04:00
tterrag a4cf5951ca Sync up canPlaceTorchOnTop logic with BlockTorch#isValidPosition 2019-04-24 00:59:03 -04:00
tterrag 822dce47cd Update skipped_commits.md 2019-04-23 21:12:22 -04:00
Tyler Hancockandtterrag 2ea475ad31 Fix special spawn event not firing in many cases. (#5389)
Co-authored-by: tterrag <[email protected]>
2019-04-23 21:10:37 -04:00
Ben Staddon eed92ba07c Only prompt for missing registries on local worlds (#5348) 2019-04-23 20:45:48 -04:00
tterrag a86317efc8 Reimplement ForgeHooks#onPlaceItemIntoWorld and remove old place events 2019-04-23 20:42:08 -04:00
Christopher Krierandtterrag ca973f053f Add EntityPlaceEvent (#5057)
Co-authored-by: tterrag <[email protected]>
2019-04-23 19:58:09 -04:00
Ben Staddon 119e4a6924 Fix small logic error in ItemTextureQuadConverter (#5463) 2019-04-23 19:03:43 -04:00
Ben Staddon aef224221f Better support for custom bows (#5209) 2019-04-23 18:04:19 -04:00
Ben Staddon 18d0f7ba0d Fix up torch placement logic to handle more vanilla special-casing (#5426) 2019-04-23 17:39:50 -04:00
tterrag dd9077d52d Update skipped_commits.md 2019-04-23 16:51:11 -04:00
LexManos 01cb2117cc Written size does not include int bytes. 2019-04-23 16:30:26 -04:00
LexManos 574f890e58 Extend Region files to support >1MB per chunk.
If the 'sector count' is 255, ask the compressed data header for the proper length.
2019-04-23 16:27:34 -04:00
tterrag e70cc4fcae Simplify custom item rendering by removing GL emissivity hacks 2019-04-23 15:23:12 -04:00
tterrag d02da21a7a Support diffuse lighting flag in item rendering 2019-04-23 15:21:01 -04:00
Ben Staddon 817546e4c8 Add a hook to allow continuously using items through stack changes (#4834) 2019-04-23 15:12:55 -04:00
tterrag 1a7e05a3da Update skipped_commits.md 2019-04-23 14:48:47 -04:00
Ben Staddon f19fed0853 Add redirects to PotionEffect to respect registry replacement (#5213) 2019-04-23 14:47:47 -04:00
tterrag 06f67f7696 Add FieldRedirectTransformer updated to new modlauncher API 2019-04-23 14:39:26 -04:00
Ben Staddon 501f1dc8dc Fix small logic error in emissive item rendering code (#5320) 2019-04-23 12:37:32 -04:00
Ben Staddon 8b5a5ecd74 Ensure slave maps are cleaned up when handling registry overrides (#5250) 2019-04-23 12:31:55 -04:00
tterrag cb3ff19801 Remove hack to force enum configs to strings 2019-04-18 22:13:19 -04:00
tterrag f30d7bc845 Fix #5688 config values are unordered, update Night-Config 2019-04-18 22:13:13 -04:00
ichttt c0aa4c8517 Cleanup/Implement some todos (#5660) 2019-04-17 13:57:32 -07:00
ichttt e868739675 Readd redirecting of stdout and stderr (#5678) 2019-04-16 14:08:08 -07:00
Vincent Lee 991682956d Fix some typos in spawn dimension patches (#5669) 2019-04-15 19:04:24 -07:00
DaemonUmbra e168d8e593 Remove Vanilla Logging Config (#5618)
This will re-enable Forge's logging configuration in "production"
2019-04-15 19:00:11 -07:00
Lars Gerrits 273b1b110a Add GuiContainerEvent.DrawBackground event. (#5595) 2019-04-15 18:56:58 -07:00
0uti bbc92fa51c [1.13.x] Fire InputEvents (#5533) 2019-04-15 18:50:18 -07:00
tterrag 8515b9dd10 Fix compile error in FakePlayer from cherry pick 2019-04-13 21:42:42 -04:00
tterrag a56f894e39 Update skipped_commits.md 2019-04-13 11:18:54 -04:00
LexManos 592b957b77 Fix potential issues with the Minecraft FakePlayer lingering around after world unloads. 2019-04-13 11:17:27 -04:00
tterrag 65cfef1b2e Fix potion remove event not always firing, add expiry event 2019-04-13 11:17:00 -04:00
mcenderdragon 914fe91db5 added PotionHooks, closes #3867, #4375 (#4614) 2019-04-13 11:03:58 -04:00
tterrag 0c19ccc11a Fix EntityDataManager logging level 2019-04-13 10:45:33 -04:00
tterrag 3560e47a77 Fix some typos in cherry-picked commits 2019-04-13 09:47:33 -04:00
tterrag c33cd678f0 Update skipped_commits.md 2019-04-12 20:18:17 -04:00
ichttt a67cce2f91 Add a hook for farmland watering (#4891) 2019-04-12 20:16:34 -04:00
ichttt 72bc39d831 Add logging for data manager key registration errors (#5129) 2019-04-12 20:01:00 -04:00
tterrag abf010ac48 Fix #5659 setdimension command entity filtering, avoid inverting logic 2019-04-12 19:43:41 -04:00
Ben Staddonandtterrag 2baa05ace9 Improve support for custom block path types (#5203)
Co-authored-by: tterrag <[email protected]>
2019-04-12 13:47:48 -04:00
Ben Staddon fa708f93ee Allow items to control the rate of repair from mending (#5102) 2019-04-12 13:26:15 -04:00
tterrag a0a3f9dbfb Update skipped_commits.md 2019-04-12 11:15:31 -04:00
Ben Staddon bda875166a Improve exception handling from server starting events (#5226) 2019-04-12 11:12:15 -04:00
Ben Staddon e376172312 Improve context provided by potion icon rendering hooks (#5111) 2019-04-12 11:05:34 -04:00
MrRiegel d20b1f271e Fix an ObjectHolderRef internal error message (#5214) 2019-04-12 10:49:26 -04:00
tterrag 67da3182c1 Implement rendering for item models with emissive quads (#5047) 2019-04-12 10:45:32 -04:00
Paul Fulham 1280dea111 Fix inaccurate main thread name shown in client log (#5078) 2019-04-12 10:23:08 -04:00
Ben Staddon 3920b7aaa3 Fix Baked Item models with transformations (#5241) 2019-04-12 10:11:15 -04:00
tterrag 52890edfac Update skipped_commits.md 2019-04-11 19:31:04 -04:00
Vincent Lee ed3aea0980 Stop firing LivingSetAttackTargetEvent for setRevengeTarget (#5217) 2019-04-11 19:01:52 -04:00
Ben Staddon 3f70fd49ff Fix missing string parameters in some log messages (#5210) 2019-04-11 18:57:37 -04:00
Ben Staddon 7496e3dbdf Re-add some missing villager profession patches (#5200)
* Fix zombie villagers only spawning with vanilla professions
* Fix spawning modded villagers that do not have their own building
2019-04-11 18:50:01 -04:00
TheIllusiveC4 7c401e9a35 Fix the bed position given to the SleepingTimeCheck event (#5107) 2019-04-11 18:09:01 -04:00
Ben Staddon a02bec7ebe Fix some null returns from defaulted registries (#5235) 2019-04-11 18:05:26 -04:00
Yanbing Zhao 254c1d1531 Only remove synthetic lambda methods referenced in body of SideOnly methods (#5127) 2019-04-11 18:02:34 -04:00
tterrag 971de3e1d0 Update skipped_commits.md 2019-04-11 17:47:13 -04:00
gaudus 7d2c8fa6ef fixed visual bug with guislider 2019-04-11 17:38:01 -04:00
Ben Staddon ac210a3201 Make Forge blockstate variants correctly inherit AO setting from vanilla models (#5190) 2019-04-11 17:35:01 -04:00
Ben Staddon a79975b3ea Make Forge-provided default transforms accessible to custom models 2019-04-11 17:32:31 -04:00
cpw aa7380acc6 Actually parse the i18n exception message into the super constructor,
so the exception has a useful text message, even in crash logs and
on the server.

Signed-off-by: cpw <[email protected]>
2019-04-06 14:22:24 -04:00
cpw cdbd842494 Refactor to use naming service, and provide an MCP naming service when
in userdev. Step 1 to supporting loading SRG mods in userdev.

Signed-off-by: cpw <[email protected]>
2019-04-06 12:10:54 -04:00
Vincent Lee 323fdb014d Fix respawnevent being fired with old player instead of new. Fixes #5658 (#5668) 2019-04-04 19:41:27 -07:00
cpw 3f735b715b Implement API for mods to control their server status response..
Signed-off-by: cpw <[email protected]>
2019-03-31 16:36:49 -04:00
cpw 4ecb04ed9f Merge branch 'pull/5636' into 1.13.x 2019-03-30 15:03:48 -04:00
cpw e0361047f7 Fix StartupQuery to run properly on dedicated server.. Closes #5649
Signed-off-by: cpw <[email protected]>
2019-03-30 14:46:30 -04:00
tterrag 37016ca77f Remove remaining deprecations, improve a few patch comments 2019-03-29 16:58:33 -04:00
tterrag 98ef5049f4 Fix BrandingControl caching text through resource reload 2019-03-29 16:29:26 -04:00
tterrag 98a470d813 Add back EntityPlayer patch to return main inventory in IItemHandler
Fixes #5638
2019-03-26 01:22:58 -04:00
cpw 944d760855 Fire the ModIdRemappingEvent on the Forge Event bus. Closes #5632
Signed-off-by: cpw <[email protected]>
2019-03-25 21:55:34 -04:00
cpw e0e999da0d Remove redundant method call in Minecraft patch. Also fix a translation
string error (closes #5643)

Signed-off-by: cpw <[email protected]>
2019-03-25 21:55:33 -04:00
tterrag 2f486f2bdd Add method to IResourcePack to hide it entirely from the UI (#5525) 2019-03-25 17:24:37 -04:00
JoJoDeveloping 7e4101b3ad Remove game registry comparsion from list ping
Signed-off-by: JoJoDeveloping <[email protected]>
2019-03-25 22:22:29 +01:00
cpw d8d30e1f82 Defer configuration of channel until it is actually available during
connection. Closes #5626

Signed-off-by: cpw <[email protected]>
2019-03-25 17:20:44 -04:00
Brennan Ward 36470f69ad Add class to wrap IItemHandler as IInventory for easier recipe interaction. (#5522) 2019-03-25 12:31:54 -07:00
mezz 5fa732d223 Remove uses of java.awt (#5591)
`java.awt` will statically load itself when `java.awt.Color`, `java.awt.Dimension`, etc are loaded.
This conflicts with lwjgl3 and must be avoided (except for in mojang's server gui).
2019-03-25 12:06:20 -07:00
Vincent Lee 5e7279b0a2 Fix PlayerInteractEvent using Dist when it should be using LogicalSide (#5611) 2019-03-25 11:41:08 -07:00
JoJoDeveloping 4764136d47 Re-Add the list ping compatibility checker
Signed-off-by: JoJoDeveloping <[email protected]>
2019-03-25 15:15:25 +01:00
tterrag 10a06157aa Update Night-Config to 3.5.0, improve defineEnum methods
Closes #5537
2019-03-23 00:12:48 -04:00
tterrag d7ba9a50df Fix loading errors GUI crashing when errors occur during construction 2019-03-22 20:58:10 -04:00
LexManos 18400e8457 Revive CapabilityProvider on entity revive. Madders should NOT need this, as caps are copied via NBT. 2019-03-19 21:21:37 -07:00
LexManos f5375783c6 Do not invalidate caps when entity is being moved across worlds. Should fix #5500 2019-03-19 14:10:29 -07:00
LexManos 8045e48952 Fix NPE in TileEntityPistonRender when class is created to early. 2019-03-17 22:15:52 -07:00
Ben Staddon be18bdee88 Fix getDefaultCreatorModId for enchanted books (#5534) 2019-03-17 13:51:10 -07:00
tterrag 1e34f331da Handle null return from ResourcePackInfo.createResourcePack 2019-03-16 01:52:37 -04:00
cpw d99a55a7d1 Allow login packets to only generate on server based connections
Run injectSnapshot on the client thread, wait for result and
disconnect when injectSnapshot fails.
Fix DevServer to load MOD_CLASSES
Fix LaunchTesting to properly load log4j2 markers (don't use a
static variable in that class!)

Signed-off-by: cpw <[email protected]>
2019-03-15 23:22:28 -04:00
tterrag 0141a959eb Exclude PR builds from discord and changelog 2019-03-14 19:33:50 -04:00
tterrag d04c849a23 Exclude noci branches from travis 2019-03-14 19:02:08 -04:00
Ben Staddon 329e04b068 Fix being unable to plant nether wart (#5572) 2019-03-13 22:37:37 -07:00
LexManos d0c7a496f7 Fix silk touch not working on Ender Chests. 2019-03-13 15:55:18 -07:00
its_meow ff6fa31b1d Fix entity spawn packet pitch (reversed yaw/pitch) (#5603) 2019-03-13 12:53:48 -07:00
LexManos 554952e02a Fix invalid inventory being sent to ItemCraftedEvent Closes #5580
Fixed custom ingredient network serialization by removing unneeded mark. Closes #5577
Changed HorseArmorType constructor to not prefix vanilla paths to custom armors. Closes #5574
Fix removeBlock being called with invalid canHarvest value. Closes #5570
2019-03-11 16:40:59 -07:00
ichttt 00845d5252 Add UI for warnings that occurred during loading (#5530) 2019-03-11 15:32:37 -07:00
LexManos 7113f4400c Fix max entity radius not being settable by making it a instance method on world. Closes #5601
Fix VoidFluidHandler.INSTANCE not being a instance of VoidFluidHandler. Closes #5602
Remove backwards compat code and make IItemHandler.isItemValid non-default. Closes #5598
2019-03-11 15:04:04 -07:00
cpw 7292b63052 Add way to publish the reobf Jar with the maven-publish
task. The standard way does not publish reobfuscated
artifacts.

Signed-off-by: cpw <[email protected]>
2019-03-09 18:43:20 -05:00
cpw 7cfc5c3316 Add in the ability to load modlists from a file.
This is simple: <modfile>.list is a newline separated list
of maven-like coordinates for mods to load into the game.
They are searched for in all known maven roots.

Signed-off-by: cpw <[email protected]>
2019-03-09 17:51:37 -05:00
LexManos 1d0c67d67b Fix rails not being able to be placed on hoppers. 2019-03-08 11:50:41 -08:00
LexManos 47e6b34d2b DimensionManager.registerDimension now returns the DimensionType instance for convienance.
You can still access others in DimensionType.getByName()
Fixed ForgeRegistry rappers not forwarding isEmpty.
2019-03-06 21:01:12 -08:00
LexManos 3003e33074 Refactor Userdev and Forgedev launching.
Locating mods on the classpath in dev should solve linked MC sources when debugging.
As well as loading deobfed mods.
Rewrote how arguments are handled in dev, so users can overwrite any defaults we provide.
Added basic Yggdrasil auth support. Passing in --username and --password arguments.
ONLY USE IF NECESSARY. Forge is NOT responsible for your login information.
2019-03-06 20:59:32 -08:00
LexManos 7bd7b059c4 Make userdev parse out the classifier for the Forge jar that is on the classpath.
Should fix debugging Minecraft at dev time.
2019-03-06 12:06:49 -08:00
cpw 230d69b772 Tidy up network initialization, and force it to classload early in
modloading lifecycle. Closes #5576

Signed-off-by: cpw <[email protected]>
2019-03-04 08:22:46 -05:00
cpw cbfa572acb Tweak log4j2 config and allow access to classdump functionality from
modlauncher.

Signed-off-by: cpw <[email protected]>
2019-03-02 15:31:35 -05:00
cpw 8f5a2be6fd Fix #5584 by copying the zipped resource to a temporary directory if
paulscode is requesting it. This is so icky.

Signed-off-by: cpw <[email protected]>
2019-03-01 22:07:11 -05:00
cpw 45f5f0904a Log a message as well, when we crash.
Signed-off-by: cpw <[email protected]>
2019-03-01 19:48:25 -05:00
cpw 6db8b3c26d Try writing a temporary file to disk when a paulscode thread requests
a resource, because even zipfilesystems return interruptible file channels.

Signed-off-by: cpw <[email protected]>
2019-03-01 19:46:59 -05:00
cpw b4ccafe718 Enforce specversion number for forgeSPI so we don't crash with weird errors later.
Signed-off-by: cpw <[email protected]>
2019-03-01 19:27:22 -05:00
cpw 3c73dc2d0b Put both LogicalSides on NetworkDirection:
Origination (where it came from) and Reception (where it arrived at).

Signed-off-by: cpw <[email protected]>
2019-02-28 21:39:36 -05:00
LexManos 58494f8878 Rewrite the FML Handshake packet formats to include actually syncing the registry data and introduce the concept of caching it locally.
Snapshots are not injected yet due top threading issues.
2019-02-27 23:56:31 -08:00
cpw cb70702ab5 Handle differing network versions for FML gracefully?
Signed-off-by: cpw <[email protected]>
2019-02-28 00:59:27 -05:00
cpw 7f1ea578d6 Fix problem with duplicate mods caused by duplicate classes found during scan.
File Scan results are now sets.

Signed-off-by: cpw <[email protected]>
2019-02-27 23:34:23 -05:00
cpw dd7e7fc122 Try to fix #5573 by peeling the worldclient fetch into a separate handler.
Signed-off-by: cpw <[email protected]>
2019-02-27 13:45:51 -05:00
cpw 0bcc60fbe3 Tidy up server launch. The JAR will resolve it's libraries from a relative
path. We just need to verify what we need is on the classpath, and
try and handle when it's not, cleanly (by recommending running the
installer).

The manifest now embeds the correct launch arguments to allow FML to
resolve - these were _never_ editable, and belong somewhere out of
the way.

Signed-off-by: cpw <[email protected]>
2019-02-26 10:28:48 -05:00
kashike 7766eed754 Add missing constructors in KeyBinding to match existing vanilla constructors. (#5480) 2019-02-25 19:57:11 -08:00
John Hannan 5fa02f53d9 Update MDK Readme to describe new FG3 procedures. (#5553) 2019-02-25 18:11:41 -08:00
LexManos 176e331fc4 Fix Custom Entity Data not persisting between world loads. Closes #5562
Fix BlockRailState inverting flexibility flag. Closes #5550
Disable Forge's hooks on dispensing Buckets until Fluid system re-write. Closes #5545
Fix modifier only keybinds. Closes #5544
2019-02-25 17:06:37 -08:00
Ben Staddon d846f23e80 Fix entity shearing logic (#5566) 2019-02-25 10:41:37 -08:00
Ben Staddon af717ad788 Fix droppers not spawning items in world (#5559) 2019-02-25 00:47:37 -05:00
cpw 2a4e05c982 Allow vanilla connections properly, and allow mods to decide.
Signed-off-by: cpw <[email protected]>
2019-02-24 13:52:26 -05:00
cpw c219416bb8 Patch DimensionSavedDataManager to not spam FS mkdirs requests for
empty files that don't exist yet, and don't contain data. Should
result in a significant performance improvement for those with slower disks.

Signed-off-by: cpw <[email protected]>
2019-02-24 13:03:11 -05:00
cpw 8d1ff45c71 Fix GUI packet dispatch, add additional blockpos helper for common usecase.
Signed-off-by: cpw <[email protected]>
2019-02-24 11:51:53 -05:00
cpw 245d0b6282 Fix startup Query to actually display (fixed commit).
Signed-off-by: cpw <[email protected]>
2019-02-23 20:42:45 -05:00
cpw bbdf52e038 Update to 0.10 modlauncher API with performance improvements..
Signed-off-by: cpw <[email protected]>
2019-02-23 14:36:05 -05:00
LexManos 237f9dec5a Hide the webhook address so people don't spam it. 2019-02-22 01:01:09 -08:00
LexManos d6dc438859 Remove debug leftovers from Jenkinsfile. 2019-02-21 21:30:01 -08:00
LexManos 1469df26db Delete old OreDictionary file, fix type in NUGGETS_IRON field name, and ping discord from jenkins. 2019-02-21 21:26:45 -08:00
LexManos b7f6fbcfcb Merge extra and data jars. As Log4j has issues with it's config being in a different jar then the custom logger. 2019-02-21 04:24:39 -08:00
tterrag 329f26ee20 Add GuiUtils.drawInscribedRect, use in mod list GUI to fix logo rendering 2019-02-19 21:48:34 -05:00
tterrag 57cd8324dc Fix reference to UnsafeHacks in RuntimeEnumExtender 2019-02-19 19:28:17 -05:00
tterrag 8aafbb9441 Fix double tall plants not being shearable, add IShearable to seagrass
Closes #5524
2019-02-19 13:24:22 -05:00
SquidDev e4c2d0a779 Add back missing ItemColors patch (#5474) 2019-02-19 12:46:41 -05:00
mariaum 59a213bdaa Fix entities being killed in one hit. Closes #5511
Fix unloc pattern for tps output
2019-02-19 12:35:32 -05:00
tterrag 4b564b91bf Fix MinecraftForge.initialize not being called.
Fixes UsernameCache and harvest tools
Closes #5529
2019-02-19 12:33:41 -05:00
tterrag 4abfedea68 Make BannerPattern extensible (#5464) 2019-02-19 12:14:14 -05:00
Ben Staddon 7d971a3262 Remove EnumFacing internal ID maps from AT file (#5526) 2019-02-18 23:16:28 -08:00
Merlin Addams b4474a4882 Fix GuiEnchantment using wrong value to index enchantClue array (#5452) 2019-02-18 20:22:53 -08:00
Ben Staddon d1ac90bb3e Fix some minor patch regressions (#5490) 2019-02-18 20:21:03 -08:00
Katrina Swales 785d9b8deb Altered EntityType registry to use a Forge based registry (#5493) 2019-02-18 14:19:25 -08:00
Cadiboo ab92801740 Fix bug with ObfuscationReflectionHelper (#5509) 2019-02-18 14:12:07 -08:00
cpw 1d6536a53b Move unsafehacks to separate JAR built separately..
Signed-off-by: cpw <[email protected]>
2019-02-18 15:54:36 -05:00
tterrag 60315d079b Clean up Entity patches, remove extra method. Closes #5494 2019-02-18 15:52:01 -05:00
tterrag 1a833a9267 Remove now defunct eclipse files from MDK 2019-02-18 15:14:42 -05:00
cpw 70be790b2a Add a simple network API..
Signed-off-by: cpw <[email protected]>
2019-02-18 15:09:03 -05:00
Jack Taylor 2e2c57dbd1 Refactor forge and example run configs based on MinecraftForge/ForgeGradle#546
- Updated run config formats based on the refactored setup
- Removed old 'runclient' and 'runserver' JavaExec tasks, replacing them by creating the run configs using the refactored setup.
- Set 'assetIndex' environment variable from FG
- Updated MDK for new run config setup
2019-02-18 14:39:05 -05:00
tterrag 3fa507d6d1 Make SpawnPlacementType extensible, remove from ArmorMaterial 2019-02-18 12:03:02 -05:00
cpw e47fa70279 Fix connection to vanilla servers. Generate a default mod server config
for mods connecting to servers.

Signed-off-by: cpw <[email protected]>
2019-02-17 16:07:47 -05:00
cpw e248503b0a Fix TPS string
Signed-off-by: cpw <[email protected]>
2019-02-17 15:03:25 -05:00
Vincent Lee 3f2c66dca5 Change openGui to take a Consumer<PacketBuffer> 2019-02-17 20:02:29 +00:00
cpw bd1769b11f Fix author and other strings in the mdk mods toml file, update coremods to 0.3.+
Signed-off-by: cpw <[email protected]>
2019-02-17 14:08:20 -05:00
Jack Taylor af98088d04 Fix World crashing on load Fixes #5499 (#5503) 2019-02-17 00:15:35 -08:00
cpw aa076695b9 Actually dispatch handleWorldDataSave. Closes #5492
Signed-off-by: cpw <[email protected]>
2019-02-16 17:38:12 -05:00
cpw 869964cb2f Merge branch 'pull/5483' into 1.13.x 2019-02-16 17:19:27 -05:00
cpw 579c3ecc0e Fix assetIndexes for 1.13.1
Signed-off-by: cpw <[email protected]>
2019-02-16 17:16:34 -05:00
cpw 63b2ad36e1 Fix travis build for 1.13.x branch
Signed-off-by: cpw <[email protected]>
2019-02-16 17:00:50 -05:00
cpw ae01194a5e Merge branch 'pull/5484' into 1.13.x 2019-02-16 16:59:13 -05:00
gegy1000 3c006c4ca4 Fix lazy ModContainer evaluation skipping thrown loadingExceptions
Fix formatting
2019-02-16 16:58:54 -05:00
cpw 738d54ff4c Fixes #5446 Listening for the same registry event in two different mods fails
Tell the mod event bus not to track phasing for events.

Signed-off-by: cpw <[email protected]>
2019-02-16 16:45:05 -05:00
SquidDev 044bb1c395 Add back missing patch for Item.BLOCK_TO_ITEM 2019-02-16 08:14:33 +00:00
cpw 180f16161c Fix the MDK..
Signed-off-by: cpw <[email protected]>
2019-02-15 21:56:54 -05:00
cpw 7f9e8d059b Fix network syncing of SERVER config. Enable COMMON Config. Fix network
login handling.

Signed-off-by: cpw <[email protected]>
2019-02-15 21:45:28 -05:00
cpw 36ccb3bbfe Fix serverlang loading issue, by frontloading MC and Forge langs,
so error messaging works.

Signed-off-by: cpw <[email protected]>
2019-02-15 20:00:41 -05:00
cpw 1e6f3fc893 Use MC VERSION in the dependencies string for the extra jar
Signed-off-by: cpw <[email protected]>
2019-02-15 01:11:31 -05:00
cpw b4d0ee9b3b Publish to mainline
Signed-off-by: cpw <[email protected]>
2019-02-14 23:15:40 -05:00
cpw 3e516e54b2 Remove Forge ChunkLoader - vanilla has a new system. API will follow.
Signed-off-by: cpw <[email protected]>
2019-02-14 23:15:40 -05:00
tterrag 3baa00decb Fix Block$Properties AT for new class name 2019-02-14 23:13:37 -05:00
cpw 09a96670e6 Fix VillagerRegistry
Signed-off-by: cpw <[email protected]>
2019-02-14 22:20:59 -05:00
cpw 78455ac3c0 Add the language providers to the main classloader as well, so
their resources are available to other classes..

Signed-off-by: cpw <[email protected]>
2019-02-14 21:43:56 -05:00
tterrag 2ec74e5c22 Fix RegistryManager#getRegistry not working for generic registry entries 2019-02-14 18:50:15 -05:00
tterrag 9d56309a05 Fix license headers 2019-02-14 18:49:40 -05:00
tterrag 4139504202 Fix GlowstoneFeature patch name 2019-02-14 18:35:39 -05:00
LexManos 2f547c8c56 Fix javac compile issues. 2019-02-14 15:21:28 -08:00
LexManos ca72710937 Initial 1.13.2 update. Major thing to note is that Dimensions have been completely revamped.
DimensionType is not unique per Dimension. See DimensionManager for more details.
Vanilla now has a chunk loading system, so Forge's will need to be deprecated/adapted.
2019-02-14 15:08:53 -08:00
cpw 9a1688599a Actually fix byte array behaviour for openGui.
Signed-off-by: cpw <[email protected]>
2019-02-14 14:34:39 -05:00
cpw d6c3df32d6 Fix byte array behaviour for OpenContainer packet
Signed-off-by: cpw <[email protected]>
2019-02-13 23:25:48 -05:00
cpw 28c0ffe333 Clean up the mod loading context objects. There is only one ThreadLocal now.
**BREAKING CHANGE** FMLModLoadingContext is renamed to FMLJavaModLoadingContext.
LanguageProviders can setup additional contextual data.

Signed-off-by: cpw <[email protected]>
2019-02-13 22:13:59 -05:00
cpw 586c24f9d6 Implement a GUI packet and GUIFACTORY for triggering from the server.
Signed-off-by: cpw <[email protected]>
2019-02-13 21:06:39 -05:00
cpw 31c0a70f8e Merge branch 'pull/5451' into 1.13-pre
# Conflicts:
#	patches/minecraft/net/minecraft/entity/player/EntityPlayer.java.patch
2019-02-13 18:59:43 -05:00
cpw 64a92530d9 Handle bad formats with an exception. Translators MAKE SURE you watch for this error!
Signed-off-by: cpw <[email protected]>
2019-02-13 18:54:43 -05:00
cpw 4441935a4a Handle invalid JAR files more gracefully. Don't crash.
Signed-off-by: cpw <[email protected]>
2019-02-13 18:33:50 -05:00
cpw f1feac76b3 Fix JKS to be stored as binary 2019-02-11 13:51:13 -05:00
cpw d9c4446ccc Enable https to Let's Encrypt endpoints by using an SSL factory with
the two extra Let's Encrypt root certs installed into an auxiliary
keystore.

The keystore was generated using standard commands, documented in the
FixSSL class.

The Let's Encrypt certificates are not provided by default in Java 8
prior to update 101.

Signed-off-by: cpw <[email protected]>
2019-02-10 23:41:40 -05:00
cpw f83500db11 Its 2019. Update licence headers to match.
Signed-off-by: cpw <[email protected]>
2019-02-10 17:57:03 -05:00
cpw fd02d81e73 Fix Terminal Handler and GUI logging on dediserver, hopefully..
Signed-off-by: cpw <[email protected]>
2019-02-10 17:51:25 -05:00
cpw 0d379fdd6b Fix config to use new system properly, without exploding the server.
Separates server specific config into the server config file.

Signed-off-by: cpw <[email protected]>
2019-02-10 16:38:14 -05:00
cpw f6fd800242 Fix up accidental newline removal that broke the console...
Signed-off-by: cpw <[email protected]>
2019-02-10 16:31:49 -05:00
cpw c25214aaf4 Fix #5429 properly, without breaking symlinks on linux..
Signed-off-by: cpw <[email protected]>
2019-02-10 15:58:12 -05:00
cpw c6afb2be3f Move to using Minecrell's terminal logger directly, for better ANSI control and JLine support.
Signed-off-by: cpw <[email protected]>
2019-02-10 14:35:21 -05:00
cpw 13501a8b05 Make a second logger with colour highlighting and control it with a sysproperty:
forge.logging.colourconsole.level (defaults to off)..

Signed-off-by: cpw <[email protected]>
2019-02-10 11:45:36 -05:00
cpw dae5994e9d Tidy up modcontainer building and discovery..
Signed-off-by: cpw <[email protected]>
2019-02-10 11:44:47 -05:00
cpw b28a418bd9 Use a configuration value for the thread count, make it default to
availableProcessors when set to <=0 (default value is -1)

Signed-off-by: cpw <[email protected]>
2019-02-10 11:44:22 -05:00
cpw 64f69cf5c9 Revert "Make sure to create entire path for directory, fixes #5429"
This reverts commit 77dd9eb8

This will completely break symlinks on linux.

Signed-off-by: cpw <[email protected]>
2019-02-10 10:26:21 -05:00
m00nl1ght-dev 8084ca43b9 Port CommandEvent and custom entity selectors to 1.13 (#5411) 2019-02-08 17:41:50 -08:00
LexManos 2e5f25d8ae Finish off most old patches, fix issue for mounted entities. 2019-02-08 17:40:07 -08:00
Vincent Lee 04b0d24678 Patch direct accesses to Entity.type to use getter instead (#5308) 2019-02-07 19:11:45 -08:00
Vincent Lee 153e7a1806 Tentatively reintroduce a container-opening system 2019-02-07 20:31:17 -06:00
tterrag 065ebd748a Add synchronized modifier to runtime enhanced enum methods 2019-02-07 17:01:40 -05:00
tterrag 79c17cb542 Add IExtensibleEnum, fix DimensionType create method 2019-02-07 16:36:30 -05:00
LexManos 9245975955 Change IRenderHandler to an interface Closes #4640 2019-02-07 12:03:13 -08:00
mcenderdragon 6ea19ec8bf Made functional interface IChunkGeneratorFactory public (#5395) 2019-02-06 23:18:47 -08:00
Bartosz Skrzypczak b527bf8ab3 Fix leaking unclosed InputStream in Scanner.fileVisitor (#5432) 2019-02-06 22:57:00 -08:00
LexManos 0b1b3c68fa Invalidate capabilities that we attach to vanilla entities and TileEntities. Closes #5307 2019-02-06 22:55:17 -08:00
LexManos d930c8ae8b 'Fix' Specific y-levels in water behaving like you're in air. Closes #5341 2019-02-06 21:43:37 -08:00
LexManos 053c5300ed Reintroduce ObfuscationReflestionHelper closes #5373 2019-02-06 20:46:21 -08:00
LexManos e8ae18efda Fixed Crosshair attack indicator texture issue Closes #5442
Add friendlier error message for @Mod annotations with missing mods.toml entry. Closes #5440
Remove Log4J console highlighting. As it doesn't work on many consoles, and prints invalid characters. Closes #5420
2019-02-06 18:18:01 -08:00
Merlin Addams 39965c55ac Let ItemGroup provide it's own tabs image resource location (#5330) 2019-02-06 16:30:43 -08:00
Merlin Addams f87dca2ad4 Allow GuiContainer and ItemGroup to specify slot hover colors (#5332) 2019-02-06 15:29:12 -08:00
Jack Taylor 3e02903d19 Port Minecraft client patch for 'ClientTickEvent' (#5397) 2019-02-06 15:14:18 -08:00
Merlin Addams febae7f8f2 Fix statistics gui crashing when handling input events (#5435) 2019-02-06 15:12:15 -08:00
LexManos 71dd5c9f4d Properly set context classloader in mod loading threads. 2019-02-05 22:42:21 -08:00
LexManos aa91af865d Rework server launching at runtime to include needed default arguments and validate libraries exist.
Move Forge config loading to manual while config system is in development.
2019-02-04 18:23:58 -08:00
Girafi 9119e395d4 Added 'create'-method for EnumCreatureType (#5400) 2019-02-04 11:40:03 -08:00
Merlin Addams 68433924c7 Fix redstone power calculation (#5433) 2019-02-04 11:38:54 -08:00
Merlin Addams 87b67cb45a Fix wrong grass block being used for comparisons (#5434) 2019-02-04 11:38:01 -08:00
tterrag 77dd9eb883 Make sure to create entire path for directory, fixes #5429 2019-02-04 12:31:47 -05:00
cpw e000fd2f8f Put the FMLModContainer back in it's cage. Delete the ClasspathLocator.
Signed-off-by: cpw <[email protected]>
2019-02-01 20:37:04 -05:00
cpw e4d20a80ed Use the resource pack directly in the GuiModList, skip the resourcepackinfo.
Closes #5418

Signed-off-by: cpw <[email protected]>
2019-02-01 16:55:28 -05:00
LexManos 36866fed10 Fix inventory items not properly being synced to client. Closes ##5421 & #5417 2019-02-01 10:41:48 -08:00
cpw 55691fce4e Expose the ModFile in the scan data, so languages can read it and make
mod construction decisions.

Signed-off-by: cpw <[email protected]>
2019-01-31 23:09:47 -05:00
Justin d2a3b5bed8 Fix RuntimeEnumExtender creating new enums with incorrect ordinal value (#5402) 2019-01-30 12:51:14 -08:00
cpw 6365674a2a Config watching and config events now actually work!
Also fixed small bug with MOD_CLASSES not defaulting to empty string.

Signed-off-by: cpw <[email protected]>
2019-01-29 15:42:56 -05:00
cpw 7a02ccc3a8 ConfigEvents - the beginning.
Signed-off-by: cpw <[email protected]>
2019-01-28 22:42:37 -05:00
cpw 2918864248 Merge branch 'pull/5405' into 1.13-pre 2019-01-28 20:50:12 -05:00
cpw 9fbfe2b98e Fix 5408 by making Paths from the default provider (not inside jars)
offer a FileInputStream rather than Files.newInputStream. Fun. Stupid
ancient paulscode.

Signed-off-by: cpw <[email protected]>
2019-01-28 20:37:25 -05:00
LexManos b40e2cc59e More old patch work, cleaned up static methods added to ItemStack, and various networking functions. 2019-01-28 16:25:49 -08:00
ichttt 3eac9c536b Config option implemented 2019-01-27 22:02:58 +01:00
ichttt ad32b01d85 Reimplement update checker 2019-01-27 21:23:24 +01:00
ichttt da33233762 Update for ForgeSPI change, revert back to VersionStatus checking 2019-01-27 20:51:35 +01:00
ichttt c2a7fe4019 Bring back the forge beta warning. Use a check to see if the forge minor version is zero, as ForgeVersion.getStatus() is not implemented 2019-01-27 19:50:59 +01:00
cpw 0067d3edce Merge branch 'pull/5404' into 1.13-pre 2019-01-27 11:45:08 -05:00
cpw ebf038231e Use recommended approach to applying version data to mdk.
Signed-off-by: cpw <[email protected]>
2019-01-27 11:42:47 -05:00
cpw f767b7096c Fix mdk properties - now the mdk offers default console debug logging
with various useful channels for development enabled.

Signed-off-by: cpw <[email protected]>
2019-01-27 11:42:46 -05:00
GoryMoon 161227b1de Fixed missed OptionalCapabilityInstance to LazyOptional refactors in patches 2019-01-27 14:47:27 +01:00
tterrag 8e43dfa7a6 Refactor OptionalCapabilityInstance to LazyOptional; clean up
- Move to util package, rename to LazyOptional
- Clean up existing javadocs, add javadocs to everything missing them
- Add more NonNull functional interfaces, and use them everywhere
- Move orEmpty() to Capability, works better here anyways
2019-01-27 01:41:07 -05:00
cpw 0a11ffb827 More logging tweaks, including some aimed at userdev.
`forge.logging.markers=<LIST OF MARKERS>` will enable markers.

Signed-off-by: cpw <[email protected]>
2019-01-27 00:06:57 -05:00
cpw 3c55b46ca0 Big cleanup of logging. Might do some tweaks of the userdev logging, but this should be good for vanilla..
Signed-off-by: cpw <[email protected]>
2019-01-26 22:18:28 -05:00
mezz 7d21e5d328 Cherry pick mezz's logging improvements..
Signed-off-by: cpw <[email protected]>
2019-01-26 21:09:43 -05:00
cpw 043069dc8a Update to 0.9.0 of modlauncher..
Signed-off-by: cpw <[email protected]>
2019-01-26 17:38:59 -05:00
cpw ea26434987 Merge branch 'ichttt-fixDuplicateNamespace' into 1.13-pre 2019-01-26 17:37:06 -05:00
ichttt 9ee34f57f5 Fix some of minecraft's resources loading twice, as minecraft is on the list of namespaces as minecraft and as an empty string 2019-01-26 23:23:05 +01:00
cpw d539dc12a1 Fix modsorter to not crash on soft dependencies that don't exist.
Signed-off-by: cpw <[email protected]>
2019-01-26 17:07:17 -05:00
cpw c578cae676 Fix resource pack info generator - use the first modid as part of the
pack prefix.

Signed-off-by: cpw <[email protected]>
2019-01-26 16:56:10 -05:00
cpw 8b74b32909 Make MOD_CLASSES available to the forge development environment as well.
Signed-off-by: cpw <[email protected]>
2019-01-26 13:07:30 -05:00
cpw 1d1133123b Change MOD_CLASSES to support %% separated paths, that are grouped into
<prefix>%%<path> sets. Allows for multiple mods to be located in UserDev.

Signed-off-by: cpw <[email protected]>
2019-01-26 12:29:55 -05:00
cpw 0bdafb976e Fix handing the "minecraft" dependency properly by adding it to the list
of mods.

Signed-off-by: cpw <[email protected]>
2019-01-26 11:23:51 -05:00
Vincent Lee 13f9418201 Send head yaw, use setPositionAndRotation 2019-01-26 10:25:20 -05:00
Vincent Lee a771a3ea06 Add license header 2019-01-26 10:25:20 -05:00
Vincent Lee 39633eef4f Clean up patch a bit, check for net.minecraft. 2019-01-26 10:25:19 -05:00
Vincent Lee 1f11ac76fa Readd modded entity spawning/tracking support 2019-01-26 10:25:19 -05:00
mariaum 2e1456517a Fix first call to ToolType.get always returning null (#5396) 2019-01-25 22:40:03 -05:00
tterrag 4db208332e Fix NPE in ItemGroup concurrency patch 2019-01-25 19:07:37 -05:00
SquidDev 659091c565 A couple of minor improvements and fixes to ForgeConfigSpec (#5394)
- Use the config file's path instead of the config object in error messages.
 - Print the dotted path of each config key instead of the array version (group.item instead of [group item]).
 - Fix comments causing a config file to be considered incorrect.
 - Pass each list element to the element validator, rather than the whole list.
2019-01-25 13:43:06 -08:00
mezz c8c54113d0 Add RecipesUpdatedEvent, fired when recipes are downloaded from the server. (#5303) 2019-01-25 13:36:42 -08:00
Vincent Lee 69f8e57cea [1.13] A sweep through deprecations (#5345) 2019-01-25 13:29:52 -08:00
ShetiPhian 06a6fac23a Add a RayTraceResult method to Block that can be can be overridden (#5354) 2019-01-25 13:29:07 -08:00
Vincent Lee fa939a890c [1.13] Make Caps, TESR, Entity renderers, and keybinds thread safe to call during parallel init (#5359) 2019-01-25 13:14:49 -08:00
Adubbz 2c8ab76240 [1.13] Check canSustainPlant for valid ground in BlockBush (#5362) 2019-01-25 13:12:34 -08:00
LexManos 7a651b8c1f Repatch missed hasTileEntity redirects. And cleanup related patches. Closes #5369 2019-01-25 13:11:06 -08:00
Merlin Addams d04df43b27 Fixed fence and iron bars block placement (#5372) 2019-01-25 11:24:56 -08:00
mcenderdragon d3c9db906f Make ChunkGeneratorType.Settings accessible for modders (#5376) 2019-01-25 11:24:24 -08:00
mcenderdragon f6e2c5c1f0 Make ItemGroup constructor threadsafe (#5384) 2019-01-25 11:23:34 -08:00
mariaum cc682fd786 Fix item interaction in creative mode. (#5385) 2019-01-25 11:21:03 -08:00
mariaum 6643997304 Fix #5365: Some chat messages lose their formatting (#5386) 2019-01-25 11:19:49 -08:00
LexManos 7b867d0069 Fix vanilla trying to load the constants json as an recipe. Closes #5388
Force constant names to use namespace of their json file. To prevent conflicts.
2019-01-25 11:18:25 -08:00
Brennan Ward a15c4dc9b0 Add recipe types for faster runtime iteration. (#5312) 2019-01-25 10:22:41 -08:00
tterrag 7c11fe1022 Fix capability attach event not firing with base type 2019-01-24 21:04:50 -05:00
Jack Taylor 66f816971f Port Minecraft client patch for 'RenderTickEvent' (#5329) 2019-01-24 12:27:25 -08:00
SquidDev 98c6d5a5f6 Add back several missing patches for FML events (#5390) 2019-01-24 12:27:05 -08:00
tterrag 0b2a98f956 Fix dependents not being loaded into mod sorter 2019-01-23 20:04:57 -05:00
liach c01b336095 Improves topological sort
This can be used for mod sorting, dependencies between registries, etc.
e.g. https://github.com/MinecraftForge/MinecraftForge/pull/4694#issuecomment-412520302

New features:
Now accepts guava graph
Performance improvement: no longer reverse the graph; changed dfs to bfs
Accepets a comparator for secondary order, e.g. natural order, index by map
Now properly reports all cycles in a graph with Tarjan's strongly connected component algorithm
Adds a test to prove the validity of the sort and cycle detection
Modified build.gradle for test source directory and dependencies

Mod loading changes:
Sort mod file info instead of suppliers (we don't have suppliers instances)
Moves cycle error reporting out of topological sort and into mod sorter
Prevent mod file dependencies between mods that share the same file

Signed-off-by: liach <[email protected]>
2019-01-21 03:06:27 +00:00
cpw 040cc4bf16 Expose a couple of mods.toml properties properly. Half-implemented
override namespace - still needs to be reviewed and determined how this
might work in detail.

Signed-off-by: cpw <[email protected]>
2019-01-20 21:26:31 -05:00
SquidDev eefc4d3e84 Use the reply logical side when enqueing work
When receiving a packet, NetworkDirection.getLogicalSide details where
the packet was the packet was sent from. Therefore, on a client it'll
be SERVER (and vice virsa), and so the work is queued on the sever
thread, instead of using Minecraft.
2019-01-20 12:31:12 -05:00
ichttt c3c979f11a Use minecraft's util class to open files 2019-01-20 12:23:44 -05:00
ichttt 276d0c49c1 Validate mod ids 2019-01-20 12:23:44 -05:00
cpw 7c840dce35 Fix classcast in autoeventsubscriber, also actually make progression
work properly. This whole thing is a bit of a gross hack.

Signed-off-by: cpw <[email protected]>
2019-01-20 12:20:27 -05:00
alexbegt 2bee5f7ac6 Fix recipe constants being overridden by a blank map. Closes #5380 2019-01-20 16:03:09 +00:00
cpw 60524f0f3e Fix case error in AutomaticEventSubscriber
Signed-off-by: cpw <[email protected]>
2019-01-20 00:32:11 -05:00
cpw 1170772a4f Tell travis to skip 1.13 builds - they don't work there.
Signed-off-by: cpw <[email protected]>
2019-01-19 23:35:20 -05:00
cpw f4d2d1a24b Move Registry Events to the mod event bus.
Add infrastructure to allow parallel or synchronous dispatch of
mod events, and pass-through of events to the dispatch system.

Signed-off-by: cpw <[email protected]>
2019-01-19 23:27:27 -05:00
tterrag ff2e35c243 Greatly improve DeferredWorkQueue API (#5357) 2019-01-18 21:10:22 -05:00
tterrag 0d1a2f2af3 Add utilities that RuntimeEnumExtender expects to exist 2019-01-17 13:11:54 -05:00
LexManos 3b029ba031 Re-introduce patch for injecting registry mappings during world loading.
And re-introduce registry freezing to ONLY the Register events.
Filter ObjectHolders by registry type and fire between every Register event.
2019-01-16 12:28:13 -08:00
tterrag cd21f7b927 Implement ConfigValue as a wrapper around ForgeConfigSpec results (#5361) 2019-01-15 23:28:40 -05:00
cpw 755eff7415 Fix exploded directory locator to actually scan all paths for a file. 2019-01-15 22:14:23 -05:00
cpw 0d3f28bd52 Update MDK for new naming scheme 2019-01-14 22:43:17 -05:00
cpw 56a3926b86 Fix up event naming, move them to sensible packages and document everything a bit. 2019-01-14 22:43:17 -05:00
Vincent Lee 220bf8730a [1.13] Expand tag deserializer to add optional values and remove values without overwriting everything. (#5350) 2019-01-14 19:23:36 -08:00
mezz 118eac8f39 Fix mod lifecycle event names 2019-01-14 14:00:15 -08:00
cpw 99452a8b45 Update a bunch of libs, rename some of the mod events to more
meaningful names.
2019-01-14 00:39:00 -05:00
LexManos eb42614288 Add list support to ForgeConfigSpec.
Fix incorrect Supplier used in ForgeConfigSpec.
Port ForgeChunkManager config to new system.
Delete old Configuration classes. It's finally gone!
2019-01-11 23:01:08 -08:00
tterrag 5238eca241 Add list of so-far skipped 1.12 commits 2019-01-11 18:32:17 -05:00
InsomniaKitten 94af6c7f9d Add CreativeTabs#getLabelColor
Patch skipped, was already applied in https://github.com/MinecraftForge/MinecraftForge/commit/47a11b9a7e35c2a2273b6828bd802f2cb06f5cd7#diff-0ea0358443c2ecf3b8682228736149b3R71
2019-01-11 18:32:17 -05:00
XCompWizandtterrag f2b54acd67 Allow providing a BufferedImage for banner render generation (#5041)
Ported to 1.13 using NativeImage

Co-authored-by: tterrag <[email protected]>
2019-01-11 18:32:17 -05:00
Tim 497bc10d0a Fix Mesa biome entry tags in the BiomeDictionary (#5177) 2019-01-11 18:32:17 -05:00
Ben Staddon c1bb5cb250 Patch PotionHelper to use registry delegates (#5142) 2019-01-11 18:32:17 -05:00
mezz 51910fe83b Update github stale so issues can be Assigned 2019-01-11 18:32:16 -05:00
tterragandGabriel Harris-Rouquette 958bbf6c9a Fix MC-136995 - Chunk loading and unloading issue with entities placed in exact positions. (#5160)
This includes three commits from 1.12.x:
https://github.com/MinecraftForge/MinecraftForge/commit/c20a5e8805f64097430cf0722011f20862a8df9c
https://github.com/MinecraftForge/MinecraftForge/commit/93b704b459c6f537d3b1651008c49ce1db2e0ca1
https://github.com/MinecraftForge/MinecraftForge/commit/ee0d43bbde37e258c36de1003436dbe3fcf88077

Scatter gun patches to improve entity tracking and position tracking.
Provided by Aikar through the Paper project, this commit of patches combines the following patches:

https://github.com/PaperMC/Paper/blob/fd1bd5223a461b6d98280bb8f2d67280a30dd24a/Spigot-Server-Patches/0306-Mark-chunk-dirty-anytime-entities-change-to-guarante.patch
https://github.com/PaperMC/Paper/blob/fd1bd5223a461b6d98280bb8f2d67280a30dd24a/Spigot-Server-Patches/0315-Always-process-chunk-registration-after-moving.patch
https://github.com/PaperMC/Paper/blob/fd1bd5223a461b6d98280bb8f2d67280a30dd24a/Spigot-Server-Patches/0335-Ensure-chunks-are-always-loaded-on-hard-position-set.patch
https://github.com/PaperMC/Paper/blob/fd1bd5223a461b6d98280bb8f2d67280a30dd24a/Spigot-Server-Patches/0378-Sync-Player-Position-to-Vehicles.patch

Co-authored-by: Gabriel Harris-Rouquette <[email protected]>
2019-01-11 18:32:16 -05:00
David Quintana e98951ee65 Fix blockstate id map calculation. (#5279) 2019-01-11 14:52:30 -08:00
LexManos 3765d912a5 Move @EventBusSubscriber application to just after construction instead of pre-init. 2019-01-11 12:28:06 -08:00
Vincent Lee 849bc00b46 Make Block.Builder methods accessible. Closes #5310 (#5313) 2019-01-11 11:47:51 -08:00
Vincent Lee f3715c3e2e Fix exception mismatch for entity types (#5344) 2019-01-11 11:47:36 -08:00
Vincent Lee 985a48f02e Fix datapack walking not working for mod datapacks. Closes #5334 (#5335) 2019-01-09 20:59:40 -08:00
Vincent Lee 4e196a445a Add missing setSeed calls to ForgeBlockModelRenderer (#5338) 2019-01-09 20:57:55 -08:00
LexManos 36d2e67b07 Reimplement @ObjectHolder scanning, and expose system for others to add handlers.
Fix forgedev and userdev run configs.
Fix issue in log functions assuming String arguments.
2019-01-09 20:57:01 -08:00
LexManos 34568a0a74 Fix reference to IForgeDimension.SleepResult being through Dimension, thus causing a Srg2Source issue.
And improper getWorld patch.
2019-01-08 05:52:25 -08:00
LexManos f7acc73282 Update userdev and runconfigs for ForgeGradle changes. 2019-01-08 00:29:36 -08:00
cpw 60926ad6ea Fix some translation strings. Will pull a big string update from crowdin too. 2019-01-06 21:02:08 -05:00
cpw f734e614e4 Fire registry events before preinit and after construct. 2019-01-06 17:19:18 -05:00
cpw 997a15c0f2 Update to 0.4.0 of modlauncher 2019-01-06 16:34:32 -05:00
cpw 1b40618f02 Fix classloading properly. ModLoadingClassLoader doesn't work
with the proper delegation model. Abandoned it, in favour of injecting
locators into the Transformer classloader directly.
2019-01-06 16:24:32 -05:00
cpw 58c78560fa Fix up some stuff with resource packs, so the guilist works properly. 2019-01-05 10:19:47 -05:00
cpw 1d1ec57909 Update mdk with some tweaks for building 2019-01-05 00:14:07 -05:00
cpw fd9c83b65f Finish up classloading system. Use ModJARURL to locate resources
and enable ModLauncher to use those instead. This allows all mods to load
within the scope of the game classloader, removing weird conflicts and
class discovery problems.
2019-01-04 23:56:10 -05:00
cpw 6baddc7e26 client and server work standalone and in forge dev. Next up userdev.
Moved some launchplugin code to the launcher. Moved servermain to
the launcher.

server currently needs cmdline arguments  --fml.forgeVersion=24.0.51-1.13-pre --fml.mcVersion=1.13 --fml.mcpVersion=2018.09.12.04.11.00 --fml.forgeGroup=net.minecraftforge.test
2019-01-01 21:35:23 -05:00
cpw e9580877b4 fix up some discovery code, and make regular runtime _mostly_ work.
Still WIP and doesn't quite get to main screen yet.
2019-01-01 16:50:04 -05:00
LexManos 440649bb95 Fix new launcher jar packaging.
Run license checker over new code.
2018-12-31 16:48:23 -08:00
cpw 48846bc0ba separated fmllauncher code from main forge mod code. This enables much
stronger classloader separation between the two sides. Forge now
loads as a regular mod.

Still needs a bunch of debugging, but structure looks good and game loads
in forge dev.
2018-12-31 16:34:33 -05:00
cpw 558e1d2fb0 ResourceLocation Utils for doing things.. 2018-12-31 16:34:33 -05:00
tterrag 0b26047ea8 Better documentation for IForgeWorldType, TERFast, TERAnimation
Also rename AnimationTESR to TileEntityRendererAnimation
2018-12-29 12:18:10 -05:00
tterrag 7f5a57f4af Fix patch mistake in IForgeWorldType: CUSTOMIZED -> BUFFET 2018-12-29 12:01:41 -05:00
mezz dc12cda505 Clean progress bar code and fix TextureMap patch (#5304) 2018-12-28 18:05:05 -08:00
mezz b4cf6f7f36 Implement GuiScreen events for mouse and keyboard (#5297) 2018-12-23 23:46:42 -08:00
mezz f2f04407a4 Add the sender to NetworkEvent.Context for server-side event handlers (#5295) 2018-12-22 23:24:11 -08:00
tterrag 8a11e3bac4 Port most of the world patches (#5294) 2018-12-22 10:31:18 -08:00
LexManos 4879b0611a Change how Forge itself is located to be loaded similar to a real mod.
Fixes Minecraft/Forge annotation data missing.
Fix Capability injection.
2018-12-21 16:07:39 -08:00
tterrag d11a67499d FastTESR -> TileEntityRendererFast 2018-12-21 17:53:01 -05:00
tterrag b3b8c78527 Rendering patches (#5262) 2018-12-21 14:45:35 -08:00
mcenderdragon 0bfa76251d Added JVM argument so lwjgl dll extraction works with unicode os usernames, closes #5282 (#5283) 2018-12-20 12:09:34 -08:00
LexManos a992a4325b Change getWorld function name to prevent inheritance change in Chunk 2018-12-18 16:11:03 -08:00
David Quintana c1225f3876 Fix the path handling for mod jar resource packs. (#5228) 2018-12-18 12:48:39 -08:00
David Quintana 152836c907 Add raytrace logic to the GuiOverlayDebugForge, so that the debug overlay can show the currently targetted block and liquid. (#5278) 2018-12-16 12:47:16 -08:00
David Quintana e47a4ea514 Fix typo in patch, that was preventing the key assigned to the chat keybind from working while in a searchable tab in the creative GUI. (#5276) 2018-12-16 11:04:37 -08:00
David Quintana 52b6da1759 Fix classloading issues in userdev (and possibly also for things like tests within forgedev) (#5275) 2018-12-13 15:33:35 -08:00
LexManos f13465012b World and TileEntity patch work.
TerrtainGen events are removed, 1.13's world gen re-write invalidates them all.
2018-12-13 01:15:53 -08:00
David Quintana b7b5dd5bea Create a userdev-specific main, and include it as an injected file in the userdev jar. (#5231) 2018-12-11 20:04:23 -08:00
LexManos 7265900c62 More entity patch work. ISpecialArmor deleted. 2018-12-10 22:19:43 -08:00
Jamie Mansfield 7a77298a60 Port some patches to 1.13 (#5267) 2018-12-10 12:37:14 -08:00
David Quintana 0177e7558e Fix vanilla exception mismatch: DataFixerUpper throws IllegalArgumentException but Minecraft tries to catch IllegalStateException instead, causing a hard crash instead of a soft one. (#5229) 2018-12-10 12:05:34 -08:00
Liqueur Librazy 719ea50d1a Use getRawSchemeSpecificPart to preserve escape characters in uri, fix #5236 (#5237) 2018-12-10 11:07:50 -08:00
LexManos bbf1ea41b8 world.gen.feature patches, worldgen should be stable with vanilla. In all places I looked. 2018-12-06 18:09:47 -08:00
LexManos eb22f42fea More patch work, our async chunk loading doesn't appear to be viable for 1.13. 2018-12-05 18:08:27 -08:00
LexManos dd32e74e34 Entity patches progress. 2018-12-05 01:16:33 -08:00
malte0811 e1b4a150c3 Fix race condition causing the FML handshake to hang (#5222) 2018-12-04 12:22:01 -08:00
LexManos 76d912c0ba Include project group in ForgeVersion and determine path to patched jar.
While testing we install to net.minecraftforge.test. So don't hardcode it.
2018-12-04 11:55:50 -08:00
LexManos a3c8e04ee6 Item and NBT patches, IShearable blocks are responsible for setting themselves to air, to allow for setting other states. 2018-12-03 18:04:37 -08:00
LexManos bf9158172f Most client patches done except the render pipeline.
Someone who has more in depth knowledge of that rendering system will need to do it.
2018-11-28 22:15:05 -08:00
LexManos b687180e12 Add my 'patches_old' directory, so that people can see my "progress".
Once the old folder is done, then patches are done.
Want to know whats still to do? Look in that folder.
Now stop asking.
2018-11-22 13:43:17 -08:00
LexManos 47a11b9a7e GUI Patches 2018-11-21 21:23:24 -08:00
LexManos b6ddb0a7cf More patchwork. 2018-11-19 19:55:46 -08:00
LexManos acb7acd661 Fix imports, remember to re-run gen patches! 2018-11-16 23:19:04 -08:00
LexManos 7c0d94ce9c Patch work, most of block classes, and fix eclipse run configs. 2018-11-16 23:15:39 -08:00
LexManos 763b3e806e Add a a test publish stage to jenkins file for PRs. Should allow for full publish cycle test without actually publishing. 2018-11-15 14:00:18 -08:00
malte0811 b5264cacf0 Fix crash when placing furnaces or brewing stands in 1.13 (#5225) 2018-11-15 13:55:18 -08:00
LexManos f1552ef20d Fix changelog classifier, and prevent jenkins from running concurrent builds.
And remove caching from setup, as it doesn't use the rangemap.
2018-11-15 12:40:30 -08:00
LexManos de7eeed916 Make Forge group/name dynamic in MDK as well. 2018-11-14 13:42:11 -08:00
LexManos 93eabce1bc Include changelog in published artifacts. 2018-11-14 13:39:56 -08:00
LexManos e693dd4923 Fix jenkinsfile version detection and attempt caching rangemap again. 2018-11-13 20:29:42 -08:00
LexManos 7f9acac469 Fix version number not having MC prefix, and build artifacts. 2018-11-13 16:49:03 -08:00
LexManos 506d5b18de Workaround for gradle issue with jar signing. 2018-11-13 16:32:55 -08:00
LexManos 5110796591 Setup instead of build. 2018-11-12 22:29:46 -08:00
LexManos eafeba9fed Change checkout process. 2018-11-12 20:24:14 -08:00
LexManos b7a1676b15 Disable tests until we re-make them. 2018-11-12 20:21:02 -08:00
LexManos 72b63e7b36 Move cache again, documentation is vague. 2018-11-12 20:18:43 -08:00
LexManos fe3fcef7a9 Potentially fix cache in Jenkinsfile. 2018-11-12 20:13:59 -08:00
LexManos 714b09ddcb Fix missing quote. 2018-11-12 20:00:15 -08:00
1386 changed files with 38944 additions and 19283 deletions

No files matched your search

+1
View File
@@ -13,3 +13,4 @@
*.pyd binary
*.cfg text eol=lf
*.py text eol=lf
*.jks binary
+3 -5
View File
@@ -6,15 +6,15 @@ staleLabel: Stale
unmarkComment: false
# Limit the number of actions per hour, from 1-30. Default is 30
limitPerRun: 1
# Issues with these labels will never be considered stale. Set to `[]` to disable
exemptLabels:
- Assigned
pulls:
# Number of days of inactivity before a Pull Request becomes stale
daysUntilStale: 60
# Number of days of inactivity before a stale Pull Request is closed
daysUntilClose: 14
# Pull Requests with these labels will never be considered stale. Set to `[]` to disable
exemptLabels:
- Assigned
# Comment to post when marking as stale. Set to `false` to disable
markComment: >
This pull request has been automatically marked as stale because it has not had recent
@@ -30,8 +30,6 @@ issues:
daysUntilStale: 180
# Number of days of inactivity before a stale Issue is closed
daysUntilClose: 14
# Issues with these labels will never be considered stale. Set to `[]` to disable
exemptLabels: []
# Comment to post when marking as stale. Set to `false` to disable
markComment: >
This issue has been automatically marked as stale because it has not had activity
-4
View File
@@ -29,10 +29,6 @@
# FML changelog
changelog.txt
/patches_old/
/patches_old_bak/
/patches/minecraft.old/
/projects.old/
*.py
*.7z
/logs/
+7
View File
@@ -28,3 +28,10 @@ script:
notifications:
email: false
# skip building travis on 1.13 - it doesn't work there
branches:
except:
- 1.13-pre
- 1.13.x
- /^noci-.*$/
+1 -1
View File
@@ -10,7 +10,7 @@ alpha. Eloraam of RedPower, and SpaceToad of Buildcraft, without their acceptian
of me taking over the project, who knows what Minecraft modding would be today.
Secondly, someone who has worked with me, and developed some of the core features
that allow modding to he as functional, and as simple as it is, cpw. For developing
that allow modding to be as functional, and as simple as it is, cpw. For developing
FML, which stabelized the client and server modding ecosystem. As well as the base
loading system that allows us to modify Minecraft's code as elegently as possible.
Vendored
+84 -37
View File
@@ -1,65 +1,112 @@
@Library('forge-shared-library')_
pipeline {
options {
disableConcurrentBuilds()
}
agent {
docker {
image 'gradlewrapper:latest'
args '-v gradlecache:/gradlecache'
image 'gradle:jdk8'
args '-v forgegc:/home/gradle/.gradle/'
}
}
environment {
GRADLE_ARGS = --no-daemon' // No daemon for now as FG3 kinda derps. //'-Dorg.gradle.daemon.idletimeout=5000'
GRADLE_ARGS = '--no-daemon --console=plain' // No daemon for now as FG3 kinda derps. //'-Dorg.gradle.daemon.idletimeout=5000'
DISCORD_WEBHOOK = credentials('forge-discord-jenkins-webhook')
DISCORD_PREFIX = "Job: Forge Branch: ${BRANCH_NAME} Build: #${BUILD_NUMBER}"
JENKINS_HEAD = 'https://wiki.jenkins-ci.org/download/attachments/2916393/headshot.png'
}
stages {
stage('fetch') {
stage('notify_start') {
when {
not {
changeRequest()
}
}
steps {
git(url: 'https://github.com/MinecraftForge/MinecraftForge.git', changelog: true)
discordSend(
title: "${DISCORD_PREFIX} Started",
successful: true,
result: 'ABORTED', //White border
thumbnail: JENKINS_HEAD,
webhookURL: DISCORD_WEBHOOK
)
}
}
cache(maxCacheSize: 250/*MB*/, caches: [
[$class: 'ArbitraryFileCache', excludes: 'log.txt', includes: '**/*', path: '${WORKSPACE}/projects/forge/build/extractRangeMap'] //Cache the rangemap to help speed up builds
]){
stage('buildandtest') {
steps {
sh './gradlew ${GRADLE_ARGS} --refresh-dependencies --continue build test'
script {
env.MYVERSION = sh(returnStdout: true, script: './gradlew properties -q | grep "version:" | awk \'{print $2}\'').trim()
}
stage('setup') {
steps {
sh './gradlew ${GRADLE_ARGS} --refresh-dependencies --continue setup'
script {
env.MYVERSION = sh(returnStdout: true, script: './gradlew :forge:properties -q | grep "version:" | awk \'{print $2}\'').trim()
}
post {
success {
writeChangelog(currentBuild, 'build/changelog.txt')
archiveArtifacts artifacts: 'build/changelog.txt', fingerprint: false
}
}
stage('changelog') {
when {
not {
changeRequest()
}
}
steps {
writeChangelog(currentBuild, 'build/changelog.txt')
}
}
stage('publish') {
when {
not {
changeRequest()
}
}
environment {
CROWDIN = credentials('forge-crowdin')
KEYSTORE = credentials('forge-jenkins-keystore-old')
KEYSTORE_KEYPASS = credentials('forge-jenkins-keystore-old-keypass')
KEYSTORE_STOREPASS = credentials('forge-jenkins-keystore-old-keypass')
}
steps {
withCredentials([usernamePassword(credentialsId: 'maven-forge-user', usernameVariable: 'MAVEN_USER', passwordVariable: 'MAVEN_PASSWORD')]) {
withGradle {
sh './gradlew ${GRADLE_ARGS} :forge:publish -PkeystoreKeyPass=${KEYSTORE_KEYPASS} -PkeystoreStorePass=${KEYSTORE_STOREPASS} -Pkeystore=${KEYSTORE} -PcrowdinKey=${CROWDIN}'
}
}
}
stage('publish') {
when {
not {
changeRequest()
}
post {
success {
build job: 'filegenerator', parameters: [string(name: 'COMMAND', value: "promote net.minecraftforge:forge ${env.MYVERSION} latest")], propagate: false, wait: false
}
environment {
FORGE_MAVEN = credentials('forge-maven-forge-user')
CROWDIN = credentials('forge-crowdin')
KEYSTORE = credentials('forge-jenkins-keystore-old')
KEYSTORE_KEYPASS = credentials('forge-jenkins-keystore-old-keypass')
KEYSTORE_STOREPASS = credentials('forge-jenkins-keystore-old-keypass')
}
steps {
sh './gradlew ${GRADLE_ARGS} forge:publish -PforgeMavenUser=${FORGE_MAVEN_USR} -PforgeMavenPassword=${FORGE_MAVEN_PSW} -PkeystoreKeyPass=${KEYSTORE_KEYPASS} -PkeystoreStorePass=${KEYSTORE_STOREPASS} -Pkeystore=${KEYSTORE} -PcrowdinKey=${CROWDIN}'
//We're testing so use the test group
sh 'curl --user ${FORGE_MAVEN} http://files.minecraftforge.net/maven/manage/promote/latest/net.minecraftforge.test.forge/${MYVERSION}'
}
}
stage('test_publish_pr') { //Publish to local repo to test full process, but don't include credentials so it can't sign/publish to maven
when {
changeRequest()
}
environment {
CROWDIN = credentials('forge-crowdin')
}
steps {
withGradle {
sh './gradlew ${GRADLE_ARGS} :forge:publish -PcrowdinKey=${CROWDIN}'
}
}
}
}
post {
always {
archiveArtifacts artifacts: 'build/libs/**/*.jar', fingerprint: true
junit 'build/test-results/*/*.xml'
jacoco sourcePattern: '**/src/*/java'
script {
archiveArtifacts artifacts: 'projects/forge/build/libs/**/*.*', fingerprint: true, onlyIfSuccessful: true, allowEmptyArchive: true
if (env.CHANGE_ID == null) { // This is unset for non-PRs
discordSend(
title: "${DISCORD_PREFIX} Finished ${currentBuild.currentResult}",
description: '```\n' + getChanges(currentBuild) + '\n```',
successful: currentBuild.resultIsBetterOrEqualTo("SUCCESS"),
result: currentBuild.currentResult,
thumbnail: JENKINS_HEAD,
webhookURL: DISCORD_WEBHOOK
)
}
}
}
}
}
+1 -1
View File
@@ -1,5 +1,5 @@
Minecraft Forge
Copyright (c) 2016-2018.
Copyright (c) 2016-2019.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
+2 -2
View File
@@ -3,8 +3,8 @@ parts herein are licensed under the terms of the LGPL 2.1 found
here http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt and
copied below.
Homepage: http://MinecraftForge.net/
http://github.com/MinecraftForge/MinecraftForge
Homepage: http://minecraftforge.net/
https://github.com/MinecraftForge/MinecraftForge
A note on authorship:
+414 -232
View File
@@ -1,8 +1,7 @@
buildscript {
repositories {
mavenLocal()
maven { url = 'http://files.minecraftforge.net/maven' }
jcenter()
maven { url = 'https://maven.minecraftforge.net/' }
mavenCentral()
}
dependencies {
@@ -22,18 +21,38 @@ import net.minecraftforge.gradle.common.task.SignJar
import net.minecraftforge.gradle.patcher.task.ApplyBinPatches
import org.apache.tools.ant.filters.ReplaceTokens
import de.undercouch.gradle.tasks.download.Download
import net.minecraftforge.gradle.patcher.task.TaskReobfuscateJar
import org.gradle.plugins.ide.eclipse.model.SourceFolder
import java.util.stream.Collectors
plugins {
id 'net.minecrell.licenser' version '0.4'
id 'org.ajoberstar.grgit' version '2.3.0'
id 'de.undercouch.download' version '3.3.0'
id "com.github.ben-manes.versions" version '0.20.0'
}
apply plugin: 'eclipse'
ext {
JAR_SIGNER = null
if (project.hasProperty('keystore')) {
JAR_SIGNER = [
storepass: project.properties.keystoreStorePass,
keypass: project.properties.keystoreKeyPass,
keystore: project.properties.keystore
]
}
MAPPING_CHANNEL = 'snapshot'
MAPPING_VERSION = '20180921-1.13'
MC_VERSION = '1.13.2'
MCP_VERSION = '20190213.203750'
}
project(':mcp') {
apply plugin: 'net.minecraftforge.gradle.forgedev.mcp'
mcp {
config = '1.13-2018.09.12.04.11.00'
config = MC_VERSION + '-' + MCP_VERSION
pipeline = 'joined'
}
}
@@ -45,20 +64,35 @@ project(':clean') {
repositories {
mavenCentral()
}
patcher {
parent = project(':mcp')
mcVersion = MC_VERSION
patchedSrc = file('src/main/java')
mappings channel: 'snapshot', version: '20180921-1.13'
mcVersion = '1.13'
}
task runclient(type: JavaExec) {
doFirst {
mkdir 'runclient'
mappings channel: MAPPING_CHANNEL, version: MAPPING_VERSION
runs {
clean_client {
taskName 'clean_client'
main 'net.minecraft.client.main.Main'
workingDirectory project.file('run')
args '--gameDir', '.'
args '--version', MC_VERSION
args '--assetsDir', downloadAssets.output
args '--assetIndex', '{asset_index}'
args '--accessToken', '0'
}
clean_server {
taskName 'clean_server'
main 'net.minecraft.server.MinecraftServer'
workingDirectory project.file('run')
}
}
classpath sourceSets.main.runtimeClasspath
args = ['--accessToken', '0', '--version', '1.13']
main 'net.minecraft.client.main.Main'
workingDir 'runclient'
}
}
@@ -71,64 +105,68 @@ project(':forge') {
apply plugin: 'net.minecrell.licenser'
apply plugin: 'de.undercouch.download'
compileJava.sourceCompatibility = compileJava.targetCompatibility = sourceCompatibility = targetCompatibility = '1.8' // Need this here so eclipse task generates correctly.
compileJava.sourceCompatibility = compileJava.targetCompatibility = sourceCompatibility = targetCompatibility = '1.8' // Need this here so eclipse task generates correctly.
group = 'net.minecraftforge'
sourceSets {
main {
fmllauncher {
java {
srcDir "$rootDir/src/main/java"
srcDirs = ["$rootDir/src/fmllauncher/java"]
}
resources {
srcDir "$rootDir/src/main/resources"
srcDirs = ["$rootDir/src/fmllauncher/resources"]
}
}
main {
compileClasspath += sourceSets.fmllauncher.runtimeClasspath
runtimeClasspath += sourceSets.fmllauncher.runtimeClasspath
java {
srcDirs = ["$rootDir/src/main/java"]
}
resources {
srcDirs = ["$rootDir/src/main/resources"]
}
}
test {
compileClasspath += sourceSets.fmllauncher.runtimeClasspath
runtimeClasspath += sourceSets.fmllauncher.runtimeClasspath
java {
srcDirs = [
"$rootDir/src/test/java",
"$rootDir/src/fmllaunchertest/java"
]
}
resources {
srcDirs = ["$rootDir/src/test/resources"]
}
}
userdev {
compileClasspath += sourceSets.main.runtimeClasspath
runtimeClasspath += sourceSets.main.runtimeClasspath
java {
srcDirs = ["$rootDir/src/userdev/java"]
}
resources {
srcDirs = ["$rootDir/src/userdev/resources"]
}
}
}
//Eclipse adds the sourcesets twice, once where we tell it to, once in the projects folder. No idea why. So delete them
eclipse.classpath.file.whenMerged { cls -> cls.entries.removeIf { e -> e instanceof SourceFolder && e.path.startsWith('src/') && !e.path.startsWith('src/main/') } }
repositories {
mavenLocal()
mavenCentral()
}
ext {
MC_VERSION = '1.13'
SPEC_VERSION = '24.0' // This is overwritten by git tag, but here so dev time doesnt explode
SPEC_VERSION = '25.0' // This is overwritten by git tag, but here so dev time doesnt explode
// The new versioning sceme is <MCVersion>-<ForgeMC>.<RB>.<CommitsSinceRB>
// ForgeMC is a unique identifier for every MC version we have supported.
// Essentially, the same as the old, except dropping the first number, and the builds are no longer unique.
MCP_ARTIFACT = project(':mcp').mcp.config
MCP_VERSION = project(':mcp').mcp.config.version.split('-')[1] // The timestamp only.
if (project.hasProperty('keystore')) {
jarsigner = [
storepass: project.properties.keystoreStorePass,
keypass: project.properties.keystoreKeyPass,
keystore: project.properties.keystore
]
}
}
patcher {
parent = project(':clean')
patches = file("$rootDir/patches/minecraft")
patchedSrc = file('src/main/java')
accessTransformer = file("$rootDir/src/main/resources/forge_at.cfg")
exc = file("$rootDir/src/main/resources/forge.exc")
srgPatches = true
clientRun {
main = 'net.minecraftforge.fml.LaunchTesting'
environment = [
target: 'fmldevclient'
]
properties = [
target: 'fmldevclient',
assetDirectory: downloadAssets.output
]
}
serverRun {
main = 'net.minecraftforge.fml.LaunchTesting'
environment = [
target: 'fmldevserver'
]
}
}
def getVersion = {
//TAG-offset-hash
def raw = grgit.describe(longDescr: true)
@@ -142,11 +180,133 @@ project(':forge') {
if (branch != null && branch.endsWith('.x') && MC_VERSION.startsWith(branch.substring(0, branch.length() - 2))) //1.13.x
branch = null
SPEC_VERSION = tag
return "${tag}.${offset}${t -> if (branch != null) t << '-' + branch}"
return "${MC_VERSION}-${tag}.${offset}${t -> if (branch != null) t << '-' + branch}".toString() //Bake the response instead of making it dynamic
}
version = getVersion()
patcher {
exc = file("$rootDir/src/main/resources/forge.exc")
parent = project(':clean')
patches = file("$rootDir/patches/minecraft")
patchedSrc = file('src/main/java')
srgPatches = true
accessTransformer = file("$rootDir/src/main/resources/META-INF/accesstransformer.cfg")
runs {
forge_client {
taskName 'forge_client'
main 'net.minecraftforge.userdev.LaunchTesting'
workingDirectory project.file('run')
environment 'target', 'fmldevclient'
environment 'assetIndex', '{asset_index}'
environment 'assetDirectory', downloadAssets.output
environment 'nativesDirectory', extractNatives.output
environment 'MC_VERSION', MC_VERSION
environment 'MCP_VERSION', MCP_VERSION
environment 'FORGE_GROUP', project.group
environment 'FORGE_SPEC', SPEC_VERSION
environment 'FORGE_VERSION', project.version.substring(MC_VERSION.length() + 1).toString()
environment 'LAUNCHER_VERSION', SPEC_VERSION
property 'terminal.ansi', 'true'
property 'org.lwjgl.system.SharedLibraryExtractDirectory', 'lwjgl_dll'
ideaModule "${rootProject.name}.${project.name}.userdev"
source sourceSets.main
source sourceSets.userdev
}
forge_test_client {
parent runs.forge_client
taskName 'forge_test_client'
environment 'MOD_CLASSES', 'dummy' // Needed to work around FG limitation, FG will replace this!
mods {
TestMods { sources sourceSets.test }
}
}
forge_server {
taskName 'forge_server'
main 'net.minecraftforge.userdev.LaunchTesting'
workingDirectory project.file('run')
environment 'target', 'fmldevserver'
environment 'MC_VERSION', MC_VERSION
environment 'MCP_VERSION', MCP_VERSION
environment 'FORGE_GROUP', project.group
environment 'FORGE_SPEC', SPEC_VERSION
environment 'FORGE_VERSION', project.version.substring(MC_VERSION.length() + 1).toString()
environment 'LAUNCHER_VERSION', SPEC_VERSION
ideaModule "${rootProject.name}.${project.name}.userdev"
source sourceSets.main
source sourceSets.userdev
}
forge_test_server {
parent runs.forge_server
taskName 'forge_test_server'
environment 'MOD_CLASSES', 'dummy' // Needed to work around FG limitation, FG will replace this!
mods {
TestMods { sources sourceSets.test }
}
}
}
}
ext {
MANIFESTS = [
'/': [
'Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
'GitCommit': grgit.head().abbreviatedId,
'Git-Branch': grgit.branch.current().getName()
] as LinkedHashMap,
'net/minecraftforge/versions/forge/': [
'Specification-Title': 'Forge',
'Specification-Vendor': 'Forge Development LLC',
'Specification-Version': SPEC_VERSION,
'Implementation-Title': project.group,
'Implementation-Version': project.version.substring(MC_VERSION.length() + 1),
'Implementation-Vendor': 'Forge Development LLC'
] as LinkedHashMap,
'net/minecraftforge/versions/mcp/': [
'Specification-Title': 'Minecraft',
'Specification-Vendor': 'Mojang',
'Specification-Version': MC_VERSION,
'Implementation-Title': 'MCP',
'Implementation-Version': MCP_VERSION,
'Implementation-Vendor': 'Forge'
] as LinkedHashMap,
'net/minecraftforge/fml/javafmlmod/': [
'Specification-Title': 'Mod Language Provider',
'Specification-Vendor': 'Forge Development LLC',
'Specification-Version': '1',
'Implementation-Title': 'FML Java Mod',
'Implementation-Version': SPEC_VERSION,
'Implementation-Vendor': 'Forge'
] as LinkedHashMap,
'net/minecraftforge/fml/loading/': [
'Specification-Title': 'Launcher',
'Specification-Vendor': 'Forge Development LLC',
'Specification-Version': '1',
'Implementation-Title': 'FML Launcher',
'Implementation-Version': SPEC_VERSION,
'Implementation-Vendor': 'Forge'
] as LinkedHashMap
]
}
group = 'net.minecraftforge.test' //TODO: remove when we jenkins is working
version = getVersion()
applyPatches {
canonicalizeAccess true
canonicalizeWhitespace true
@@ -157,89 +317,47 @@ project(':forge') {
transitive = false //Don't pull all libraries, if we're missing something, add it to the installer list so the installer knows to download it.
}
api.extendsFrom(installer)
fmllauncherImplementation.extendsFrom(installer)
}
dependencies {
api 'net.minecraft:client:1.13:extra'
api 'net.minecraft:client:${MC_VERSION}:extra'
installer 'com.paulscode:soundsystem:2018+'
installer 'org.ow2.asm:asm:6.2'
installer 'org.ow2.asm:asm-commons:6.2'
installer 'org.ow2.asm:asm-tree:6.2'
installer 'cpw.mods:modlauncher:0.1.0'
installer 'net.minecraftforge:accesstransformers:0.10+:shadowed'
installer 'net.minecraftforge:eventbus:0.1+:service'
installer 'net.minecraftforge:forgespi:0.1+'
installer 'net.minecraftforge:coremods:0.1+'
installer 'com.electronwill.night-config:core:3.4.0'
installer 'com.electronwill.night-config:toml:3.4.0'
installer 'org.jline:jline:3.5.1'
installer 'org.apache.maven:maven-artifact:3.5.3'
installer 'net.jodah:typetools:0.5.0'
installer 'cpw.mods:modlauncher:2.1.+'
installer 'cpw.mods:grossjava9hacks:1.1.+'
installer 'net.minecraftforge:accesstransformers:0.16.+:shadowed'
installer 'net.minecraftforge:eventbus:0.9.+:service'
installer 'net.minecraftforge:forgespi:0.13.+'
installer 'net.minecraftforge:coremods:0.5.+'
installer 'net.minecraftforge:unsafe:0.2.+'
installer 'com.electronwill.night-config:core:3.6.0'
installer 'com.electronwill.night-config:toml:3.6.0'
installer 'org.jline:jline:3.9.0'
installer 'org.apache.maven:maven-artifact:3.6.0'
installer 'net.jodah:typetools:0.6.0'
installer 'java3d:vecmath:1.5.2'
installer 'org.apache.logging.log4j:log4j-api:2.11.1'
installer 'org.apache.logging.log4j:log4j-core:2.11.1'
}
task runclient(type: JavaExec, dependsOn: [":forge:downloadAssets", ":forge:extractNatives"]) {
doFirst {
mkdir 'runclient'
}
doFirst {
copy {
from sourceSets.main.resources
into "$buildDir/classes/java/main"
}
}
//jvmArgs = ['-verbose:class']
classpath sourceSets.main.runtimeClasspath
main 'net.minecraftforge.fml.LaunchTesting'
systemProperties = [
"org.lwjgl.util.Debug": "true",
"org.lwjgl.util.DebugLoader": "true",
"mc.version": "${MC_VERSION}",
"mcp.version": "${MCP_VERSION}",
"forge.version": "${project.version.substring(MC_VERSION.length() + 1)}",
"forge.spec":"${SPEC_VERSION}"
]
environment += [
target:'fmldevclient',
assetDirectory: file("${gradle.getGradleUserHomeDir()}/caches/forge_gradle/assets/"),
nativesDirectory: extractNatives.output
]
workingDir 'runclient'
}
task runserver(type: JavaExec) {
doFirst {
mkdir 'runserver'
}
doFirst {
copy {
from sourceSets.main.resources
into "$buildDir/classes/java/main"
}
}
classpath sourceSets.main.runtimeClasspath
main 'net.minecraftforge.fml.LaunchTesting'
args 'nogui'
systemProperties = [
"mc.version": "${MC_VERSION}",
"mcp.version": "${MCP_VERSION}",
"forge.version": "${project.version.substring(MC_VERSION.length() + 1)}",
"forge.spec":"${SPEC_VERSION}"
]
environment target:'fmldevserver'
workingDir 'runserver'
standardInput = System.in
installer 'org.apache.logging.log4j:log4j-api:2.15.0' //TODO: Unpin in 1.18.1 or when Mojang bumps the Log4J version
installer 'org.apache.logging.log4j:log4j-core:2.15.0' //TODO: Unpin in 1.18.1 or when Mojang bumps the Log4J version
installer 'org.apache.logging.log4j:log4j-slf4j18-impl:2.15.0' //TODO: Unpin in 1.18.1 or when Mojang bumps the Log4J version
installer 'net.minecrell:terminalconsoleappender:1.1.+'
installer 'net.sf.jopt-simple:jopt-simple:5.0.4'
fmllauncherImplementation 'com.google.guava:guava:21.0'
fmllauncherImplementation 'com.google.code.gson:gson:2.8.0'
testImplementation "org.junit.jupiter:junit-jupiter-api:5.0.0"
testImplementation "org.opentest4j:opentest4j:1.0.0" // needed for junit 5
testImplementation "org.hamcrest:hamcrest-all:1.3" // needs advanced matching for list order
}
def extraTxts = [
rootProject.file('CREDITS.txt'),
rootProject.file('LICENSE.txt')
]
/* TODO: Changelog
if (project.hasProperty('forgeJenkinsPass'))
def changelog = rootProject.file('build/changelog.txt')
if (changelog.exists())
extraTxts += changelog
*/
task downloadCrowdin() {
ext {
@@ -345,10 +463,10 @@ project(':forge') {
}
}
task launcherJson(dependsOn: 'signUniversal') {
task launcherJson(dependsOn: ['signUniversalJar', 'signLauncherJar']) {
inputs.file universalJar.archivePath
ext {
output = file('build/libs/version.json')
output = file('build/version.json')
vanilla = project(':mcp').file('build/mcp/downloadJson/version.json')
timestamp = dateToIso8601(new Date())
comment = [
@@ -371,28 +489,20 @@ project(':forge') {
type: 'release',
mainClass: 'cpw.mods.modlauncher.Launcher',
inheritsFrom: MC_VERSION,
logging: [ client: [
argument: '-Dlog4j.configurationFile=${path}',
file: [
id:'client-1.12.xml',
sha1:'ef4f57b922df243d0cef096efe808c72db042149',
size:877,
url:'https://launcher.mojang.com/v1/objects/ef4f57b922df243d0cef096efe808c72db042149/client-1.12.xml'
],
type: 'log4j2-xml'
]],
logging: {},
arguments: [
game: ['--launchTarget', 'fmlclient']
game: ['--launchTarget', 'fmlclient', '--fml.forgeVersion', "${project.version.substring(MC_VERSION.length() + 1)}", '--fml.mcVersion', "${MC_VERSION}", '--fml.forgeGroup', "${project.group}", '--fml.mcpVersion', "${MCP_VERSION}"]
],
libraries: [
[
//Package our launcher jar as the 'main' jar Mojang's launcher loads. It will in turn load Forge's regular jars itself.
name: "${project.group}:${project.name}:${project.version}",
downloads: [
artifact: [
path: "${project.group.replace('.', '/')}/${project.name}/${project.version}/${project.name}-${project.version}.jar",
url: "", //Do not include the URL so that the installer/launcher won't grab it. This is also why we don't have the universal classifier
sha1: sha1(universalJar.archivePath),
size: universalJar.archivePath.length()
sha1: sha1(launcherJar.archivePath),
size: launcherJar.archivePath.length()
]
]
]
@@ -410,9 +520,9 @@ project(':forge') {
task installerJson(dependsOn: [launcherJson, genClientBinPatches, applyClientBinPatches, applyServerBinPatches]) {
ext {
output = file('build/libs/install_profile.json')
output = file('build/install_profile.json')
INSTALLER_TOOLS = 'net.minecraftforge:installertools:1.0.3'
JAR_SPLITTER = 'net.minecraftforge:jarsplitter:1.0.4'
JAR_SPLITTER = 'net.minecraftforge:jarsplitter:1.1.0'
}
doFirst {
ext.BIN_PATCHER = 'net.minecraftforge:binarypatcher:' + genClientBinPatches.resolvedVersion
@@ -423,9 +533,22 @@ project(':forge') {
inputs.file launcherJson.output
outputs.file output
doLast {
def libs = [:]
def libs = [
"${project.group}:${project.name}:${project.version}:universal": [
name: "${project.group}:${project.name}:${project.version}:universal",
downloads: [
artifact: [
path: "${project.group.replace('.', '/')}/${project.name}/${project.version}/${project.name}-${project.version}-universal.jar",
url: "", //Do not include the URL so that the installer/launcher won't grab it. This is also why we don't have the universal classifier
sha1: sha1(universalJar.archivePath),
size: universalJar.archivePath.length()
]
]
]
]
def json = [
_comment_: launcherJson.comment,
spec: 0,
profile: project.name,
version: launcherJson.id,
json: '/version.json',
@@ -450,14 +573,6 @@ project(':forge') {
client: "'${sha1(tasks.getByName('downloadClientSlim').output)}'",
server: "'${sha1(tasks.getByName('downloadServerSlim').output)}'"
],
MC_DATA: [
client: "[net.minecraft:client:${MC_VERSION}:data]",
server: "[net.minecraft:server:${MC_VERSION}:data]"
],
MC_DATA_SHA: [
client: "'${sha1(tasks.getByName('downloadClientData').output)}'",
server: "'${sha1(tasks.getByName('downloadServerData').output)}'"
],
MC_EXTRA: [
client: "[net.minecraft:client:${MC_VERSION}:extra]",
server: "[net.minecraft:server:${MC_VERSION}:extra]"
@@ -495,13 +610,11 @@ project(':forge') {
args: [
'--input', '{MINECRAFT_JAR}',
'--slim', '{MC_SLIM}',
'--data', '{MC_DATA}',
'--extra', '{MC_EXTRA}',
'--srg', '{MAPPINGS}'
],
outputs: [
'{MC_SLIM}': '{MC_SLIM_SHA}',
'{MC_DATA}': '{MC_DATA_SHA}',
'{MC_EXTRA}': '{MC_EXTRA_SHA}'
]
], [ // SpecialSource has a bug where it won't create the nessasary directories, remove when they fix that.
@@ -541,7 +654,7 @@ project(':forge') {
}
['client', 'server'].each { side ->
['slim', 'extra', 'data'].each { type ->
['slim', 'extra'].each { type ->
def name = "download${side.capitalize()}${type.capitalize()}"
task "${name}"(type: DownloadMavenArtifact) {
artifact = "net.minecraft:${side}:${MC_VERSION}:${type}"
@@ -575,71 +688,58 @@ project(':forge') {
from { !crowdin.state.skipped ? zipTree(crowdin.archivePath) : null}
dependsOn crowdin
doFirst {
MANIFESTS.each{ pkg, values ->
if (pkg == '/') {
manifest.attributes(values)
} else {
manifest.attributes(values, pkg)
}
}
}
}
task launcherJar(type: Jar) {
classifier 'launcher'
from sourceSets.fmllauncher.output
doFirst {
def classpath = new StringBuilder()
def artifacts = getArtifacts(project, project.configurations.installer, false)
artifacts.each { key, lib ->
classpath += "libraries/${lib.downloads.artifact.path} "
}
classpath += "libraries/net/minecraft/server/${MC_VERSION}/server-${MC_VERSION}-data.jar "
classpath += "libraries/net/minecraft/server/${MC_VERSION}/server-${MC_VERSION}-extra.jar"
manifest.attributes([
'Main-Class': 'net.minecraftforge.server.ServerMain',
'Timestamp': new Date().format("yyyy-MM-dd'T'HH:mm:ssZ"),
'GitCommit': grgit.head().getAbbreviatedId(8),
'Git-Branch': grgit.branch.current().getName(),
'Class-Path': classpath.toString()
] as LinkedHashMap)
manifest.attributes([
'Specification-Title': 'Forge',
'Specification-Vendor': 'Forge Development LLC',
'Specification-Version': SPEC_VERSION,
'Implementation-Title': 'Forge',
'Implementation-Version': project.version.substring(MC_VERSION.length() + 1),
'Implementation-Vendor': 'Forge Development LLC'
] as LinkedHashMap, 'net/minecraftforge/versions/forge/')
manifest.attributes([
'Specification-Title': 'Minecraft',
'Specification-Vendor': 'Mojang',
'Specification-Version': MC_VERSION,
'Implementation-Title': 'MCP',
'Implementation-Version': MCP_VERSION,
'Implementation-Vendor': 'Forge'
] as LinkedHashMap, 'net/minecraftforge/versions/mcp/')
MANIFESTS.each{ pkg, values ->
if (pkg == '/') {
manifest.attributes(values += [
'Main-Class': 'net.minecraftforge.server.ServerMain',
'Class-Path': classpath.toString(),
'ServerLaunchArgs': [
'--gameDir', '.',
'--launchTarget', 'fmlserver',
'--fml.forgeVersion', "${project.version.substring(MC_VERSION.length() + 1)}".toString(),
'--fml.mcpVersion', MCP_VERSION,
'--fml.mcVersion', MC_VERSION,
'--fml.forgeGroup', project.group
].join(' ')
])
} else {
manifest.attributes(values, pkg)
}
}
}
}
task signUniversal(type: SignJar, dependsOn: universalJar) {
onlyIf {
project.hasProperty('jarsigner') && universalJar.state.failure == null
}
def jarsigner = [:];
if (project.hasProperty('jarsigner'))
jarsigner = project.jarsigner;
alias = 'forge'
storePass = jarsigner.storepass
keyPass = jarsigner.keypass
keyStore = jarsigner.keystore
inputFile = universalJar.archivePath
outputFile = universalJar.archivePath
doFirst {
project.logger.lifecycle('Signing: ' + inputFile)
}
}
universalJar.finalizedBy(signUniversal)
task downloadInstaller(type: DownloadMavenArtifact) {
artifact = 'net.minecraftforge:installer:2.0.+:shrunk'
artifact = 'net.minecraftforge:installer:2.1.+:shrunk'
changing = true
}
task installerJar(type: Zip, dependsOn: [downloadInstaller, signUniversal, installerJson, launcherJson, genClientBinPatches, genServerBinPatches]) {
task installerJar(type: Zip, dependsOn: [downloadInstaller, installerJson, launcherJson, genClientBinPatches, genServerBinPatches, 'signUniversalJar', 'signLauncherJar']) {
classifier = 'installer'
extension = 'jar' //Needs to be Zip task to not override Manifest, so set extension
destinationDir = file('build/libs')
from(extraTxts)
from(rootProject.file('/src/main/resources/forge_logo.png')) {
rename{'big_logo.png'}
@@ -653,6 +753,9 @@ project(':forge') {
}
from(universalJar) {
into "/maven/${project.group.replace('.', '/')}/${project.name}/${project.version}/"
}
from(launcherJar) {
into "/maven/${project.group.replace('.', '/')}/${project.name}/${project.version}/"
rename { "${project.name}-${project.version}.jar" }
}
from(installerJson.output)
@@ -661,32 +764,31 @@ project(':forge') {
duplicatesStrategy = 'exclude'
}
}
task signInstaller(type: SignJar, dependsOn: installerJar) {
onlyIf {
project.hasProperty('jarsigner') && installerJar.state.failure == null
}
def jarsigner = [:];
if (project.hasProperty('jarsigner'))
jarsigner = project.jarsigner;
alias = 'forge'
storePass = jarsigner.storepass
keyPass = jarsigner.keypass
keyStore = jarsigner.keystore
inputFile = installerJar.archivePath
outputFile = installerJar.archivePath
doFirst {
project.logger.lifecycle('Signing: ' + inputFile)
[universalJar, launcherJar, installerJar].each { t ->
task "sign${t.name.capitalize()}"(type: SignJar, dependsOn: t) {
onlyIf {
JAR_SIGNER != null && t.state.failure == null
}
def jarsigner = JAR_SIGNER == null ? [:] : JAR_SIGNER
alias = 'forge'
storePass = jarsigner.storepass
keyPass = jarsigner.keypass
keyStore = jarsigner.keystore
inputFile = t.archivePath
outputFile = t.archivePath
doFirst {
project.logger.lifecycle('Signing: ' + inputFile)
}
}
t.finalizedBy(tasks.getByName("sign${t.name.capitalize()}"))
}
installerJar.finalizedBy(signInstaller)
task makeMdk(type: Zip) {
baseName = project.name
classifier = 'mdk'
version = project.version
destinationDir = file('build/distributions')
destinationDir = file('build/libs')
from rootProject.file('gradlew')
from rootProject.file('gradlew.bat')
@@ -695,10 +797,18 @@ project(':forge') {
into('gradle/')
}
from(rootProject.file('mdk/')){
/* filter(ReplaceTokens, tokens: [
VERSION: project.version
rootProject.file('mdk/gitignore.txt').eachLine{
if (!it.trim().isEmpty() && !it.trim().startsWith('#'))
exclude it
}
filter(ReplaceTokens, tokens: [
FORGE_VERSION: project.version,
FORGE_GROUP: project.group,
FORGE_NAME: project.name,
MC_VERSION: MC_VERSION,
MAPPING_CHANNEL: MAPPING_CHANNEL,
MAPPING_VERSION: MAPPING_VERSION
])
*/
rename 'gitignore\\.txt', '.gitignore'
}
}
@@ -708,6 +818,37 @@ project(':forge') {
artifacts.each { key, lib ->
addLibrary(lib.name)
}
addLibrary("${project.group}:${project.name}:${project.version}:launcher")
runs {
client {
main 'net.minecraftforge.userdev.LaunchTesting'
environment 'target', 'fmluserdevclient'
environment 'assetIndex', '{asset_index}'
environment 'assetDirectory', '{assets_root}'
environment 'nativesDirectory', '{natives}'
environment 'MC_VERSION', "${MC_VERSION}"
environment 'FORGE_GROUP', "${project.group}"
environment 'MCP_VERSION', "${MCP_VERSION}"
environment 'MOD_CLASSES', '{source_roots}'
environment 'MCP_MAPPINGS', '{mcp_mappings}'
environment 'FORGE_VERSION', "${project.version.substring(MC_VERSION.length() + 1)}"
}
server {
main 'net.minecraftforge.userdev.LaunchTesting'
environment 'target', 'fmluserdevserver'
environment 'MC_VERSION', "${MC_VERSION}"
environment 'FORGE_GROUP', "${project.group}"
environment 'MCP_VERSION', "${MCP_VERSION}"
environment 'MOD_CLASSES', '{source_roots}'
environment 'MCP_MAPPINGS', '{mcp_mappings}'
environment 'FORGE_VERSION', "${project.version.substring(MC_VERSION.length() + 1)}"
}
}
}
license {
@@ -731,16 +872,54 @@ project(':forge') {
}
}
task userdevExtras(type:Jar) {
dependsOn classes
from sourceSets.userdev.output
classifier 'userdev-temp'
}
task userdevExtrasReobf(type:TaskReobfuscateJar) {
dependsOn userdevExtras, createMcp2Srg
input = tasks.userdevExtras.archivePath
classpath = project.configurations.compile
srg = tasks.createMcp2Srg.output
}
userdevJar {
dependsOn userdevExtrasReobf
from (zipTree(tasks.userdevExtrasReobf.output)) {
into '/inject/'
}
from (sourceSets.userdev.output.resourcesDir) {
into '/inject/'
}
}
extractRangeMap {
addDependencies jar.archivePath
addSources sourceSets.userdev.java.srcDirs
}
applyRangeMap {
setSources sourceSets.userdev.java.srcDirs
}
tasks.eclipse.dependsOn('genEclipseRuns')
publishing {
publications {
mavenJava(MavenPublication) {
artifact universalJar
//TODO: changelog
if (changelog.exists()) {
artifact(changelog) {
classifier = 'changelog'
}
}
artifact installerJar
//TODO: installer-win
artifact makeMdk
artifact userdevJar
artifact sourcesJar
artifact launcherJar
pom {
name = 'forge'
@@ -770,12 +949,15 @@ project(':forge') {
}
repositories {
maven {
if (project.hasProperty('forgeMavenPassword')) {
credentials {
username project.properties.forgeMavenUser
password project.properties.forgeMavenPassword
if (System.env.MAVEN_USER) {
url "https://maven.minecraftforge.net/releases/"
authentication {
basic(BasicAuthentication)
}
credentials {
username = System.env.MAVEN_USER ?: 'not'
password = System.env.MAVEN_PASSWORD ?: 'set'
}
url 'http://files.minecraftforge.net/maven/manage/upload'
} else {
url 'file://' + rootProject.file('repo').getAbsolutePath()
}
@@ -828,7 +1010,7 @@ def getArtifacts(project, config, classifiers) {
def path = "${folder}${filename}"
def url = "https://libraries.minecraft.net/${path}"
if (!checkExists(url)) {
url = "https://files.minecraftforge.net/maven/${path}"
url = "https://maven.minecraftforge.net/${path}"
}
//TODO remove when Mojang launcher is updated
if (!classifiers && art.classifier != null) { //Mojang launcher doesn't currently support classifiers, so... move it to part of the version, and force the extension to 'jar'
+12 -21
View File
@@ -19,35 +19,26 @@ http://mcforge.readthedocs.io/en/latest/gettingstarted/
Step 1: Open your command-line and browse to the folder where you extracted the zip file.
Step 2: Once you have a command window up in the folder that the downloaded material was placed, type:
Step 2: You're left with a choice.
If you prefer to use Eclipse:
1. Run the following command: "gradlew genEclipseRuns" (./gradlew genEclipseRuns if you are on Mac/Linux)
2. Open Eclipse, Import > Existing Gradle Project > Select Folder
or run "gradlew eclipse" to generate the project.
(Current Issue)
4. Open Project > Run/Debug Settings > Edit runClient and runServer > Environment
5. Edit MOD_CLASSES to show [modid]%%[Path]; 2 times rather then the generated 4.
Windows: "gradlew setupDecompWorkspace"
Linux/Mac OS: "./gradlew setupDecompWorkspace"
Step 3: After all that finished, you're left with a choice.
For eclipse, run "gradlew eclipse" (./gradlew eclipse if you are on Mac/Linux)
If you prefer to use IntelliJ, steps are a little different.
If you prefer to use IntelliJ:
1. Open IDEA, and import project.
2. Select your build.gradle file and have it import.
3. Once it's finished you must close IntelliJ and run the following command:
"gradlew genIntellijRuns" (./gradlew genIntellijRuns if you are on Mac/Linux)
Step 4: The final step is to open Eclipse and switch your workspace to /eclipse/ (if you use IDEA, it should automatically start on your project)
3. Run the following command: "gradlew genIntellijRuns" (./gradlew genIntellijRuns if you are on Mac/Linux)
4. Refresh the Gradle Project in IDEA if required.
If at any point you are missing libraries in your IDE, or you've run into problems you can run "gradlew --refresh-dependencies" to refresh the local cache. "gradlew clean" to reset everything {this does not affect your code} and then start the processs again.
Should it still not work,
Refer to #ForgeGradle on EsperNet for more information about the gradle environment.
Tip:
If you do not care about seeing Minecraft's source code you can replace "setupDecompWorkspace" with one of the following:
"setupDevWorkspace": Will patch, deobfuscate, and gather required assets to run minecraft, but will not generate human readable source code.
"setupCIWorkspace": Same as Dev but will not download any assets. This is useful in build servers as it is the fastest because it does the least work.
Tip:
When using Decomp workspace, the Minecraft source code is NOT added to your workspace in a editable way. Minecraft is treated like a normal Library. Sources are there for documentation and research purposes and usually can be accessed under the 'referenced libraries' section of your IDE.
or the Forge Project Discord discord.gg/UvedJ9m
Forge source installation
=========================
+95 -57
View File
@@ -1,92 +1,130 @@
buildscript {
repositories {
mavenLocal()
maven { url = 'http://files.minecraftforge.net/maven' }
jcenter()
maven { url = 'https://maven.minecraftforge.net/' }
mavenCentral()
}
// This is only here while i'm activly developing FG, Remind me to remove when we publically release
configurations {
classpath.resolutionStrategy {
cacheDynamicVersionsFor 10, 'seconds'
cacheChangingModulesFor 0, 'seconds'
}
}
dependencies {
classpath group: 'net.minecraftforge.gradle', name: 'ForgeGradle', version: '3.+', changing: true
}
}
apply plugin: 'net.minecraftforge.gradle'
//Only edit below this line, the above code adds and enables the necessary things for Forge to be setup.
repositories {
maven { url ='file://' + file('../repo').absolutePath } //Used by Forge development testing only, you can delete this.
}
// Only edit below this line, the above code adds and enables the necessary things for Forge to be setup.
apply plugin: 'eclipse'
apply plugin: 'maven-publish'
version = '1.0'
group = 'com.yourname.modid' // http://maven.apache.org/guides/mini/guide-naming-conventions.html
archivesBaseName = 'modid'
sourceCompatibility = targetCompatibility = '1.8' // Need this here so eclipse task generates correctly.
compileJava {
sourceCompatibility = targetCompatibility = '1.8'
}
sourceCompatibility = targetCompatibility = compileJava.sourceCompatibility = compileJava.targetCompatibility = '1.8' // Need this here so eclipse task generates correctly.
minecraft {
// the mappings can be changed at any time, and must be in the following format.
// snapshot_YYYYMMDD snapshot are built nightly.
// stable_# stables are built at the discretion of the MCP team.
// The mappings can be changed at any time, and must be in the following format.
// snapshot_YYYYMMDD Snapshot are built nightly.
// stable_# Stables are built at the discretion of the MCP team.
// Use non-default mappings at your own risk. they may not always work.
// simply re-run your setup task after changing the mappings to update your workspace.
mappings channel: 'snapshot', version: '20180921-1.13'
// Simply re-run your setup task after changing the mappings to update your workspace.
mappings channel: '@MAPPING_CHANNEL@', version: '@MAPPING_VERSION@'
// makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable.
accessTransformer = file('test_at.cfg')
// accessTransformer = file('build/resources/main/META-INF/accesstransformer.cfg')
// Default run configurations.
// These can be tweaked, removed, or duplicated as needed.
runs {
client {
workingDirectory project.file('run')
// Recommended logging data for a userdev environment
property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'
// Recommended logging level for the console
property 'forge.logging.console.level', 'debug'
mods {
examplemod {
source sourceSets.main
}
}
}
server {
workingDirectory project.file('run')
// Recommended logging data for a userdev environment
property 'forge.logging.markers', 'SCAN,REGISTRIES,REGISTRYDUMP'
// Recommended logging level for the console
property 'forge.logging.console.level', 'debug'
mods {
examplemod {
source sourceSets.main
}
}
}
}
}
dependencies {
// Specify the version of Minecraft to use, If this is any group other then 'net.minecraft' it is assumed
// that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied.
minecraft 'net.minecraftforge:forge:1.13-15.24.0.0-1.13-pre'
// that the dep is a ForgeGradle 'patcher' dependency. And it's patches will be applied.
// The userdev artifact is a special name and will get all sorts of transformations applied to it.
minecraft '@FORGE_GROUP@:@FORGE_NAME@:@FORGE_VERSION@'
// you may put jars on which you depend on in ./libs
// or you may define them like so..
//compile "some.group:artifact:version:classifier"
//compile "some.group:artifact:version"
// You may put jars on which you depend on in ./libs or you may define them like so..
// compile "some.group:artifact:version:classifier"
// compile "some.group:artifact:version"
// real examples
//compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env
//compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env
// Real examples
// compile 'com.mod-buildcraft:buildcraft:6.0.8:dev' // adds buildcraft to the dev env
// compile 'com.googlecode.efficient-java-matrix-library:ejml:0.24' // adds ejml to the dev env
// the 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime.
//provided 'com.mod-buildcraft:buildcraft:6.0.8:dev'
// The 'provided' configuration is for optional dependencies that exist at compile-time but might not at runtime.
// provided 'com.mod-buildcraft:buildcraft:6.0.8:dev'
// the deobf configurations: 'deobfCompile' and 'deobfProvided' are the same as the normal compile and provided,
// except that these dependencies get remapped to your current MCP mappings
//deobfCompile 'com.mod-buildcraft:buildcraft:6.0.8:dev'
//deobfProvided 'com.mod-buildcraft:buildcraft:6.0.8:dev'
// These dependencies get remapped to your current MCP mappings
// deobf 'com.mod-buildcraft:buildcraft:6.0.8:dev'
// for more info...
// For more info...
// http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html
// http://www.gradle.org/docs/current/userguide/dependency_management.html
}
processResources {
// this will ensure that this task is redone when the versions change.
inputs.property 'version', project.version
inputs.property 'mcversion', '1.13'
// replace stuff in mcmod.info, nothing else
from(sourceSets.main.resources.srcDirs) {
include 'mcmod.info'
// replace version and mcversion
expand 'version':project.version, 'mcversion': '1.13'
}
// copy everything else except the mcmod.info
from(sourceSets.main.resources.srcDirs) {
exclude 'mcmod.info'
// Example for how to get properties into the manifest for reading by the runtime..
jar {
manifest {
attributes([
"Specification-Title": "examplemod",
"Specification-Vendor": "examplemodsareus",
"Specification-Version": "1", // We are version 1 of ourselves
"Implementation-Title": project.name,
"Implementation-Version": "${version}",
"Implementation-Vendor" :"examplemodsareus",
"Implementation-Timestamp": new Date().format("yyyy-MM-dd'T'HH:mm:ssZ")
])
}
}
// Example configuration to allow publishing using the maven-publish task
// we define a custom artifact that is sourced from the reobfJar output task
// and then declare that to be published
// Note you'll need to add a repository here
def reobfFile = file("$buildDir/reobfJar/output.jar")
def reobfArtifact = artifacts.add('default', reobfFile) {
type 'jar'
builtBy 'reobfJar'
}
publishing {
publications {
mavenJava(MavenPublication) {
artifact reobfArtifact
}
}
repositories {
maven {
url "file:///${project.projectDir}/mcmodsrepo"
}
}
}
@@ -1,4 +0,0 @@
#Sun Jun 05 18:58:07 CEST 2011
version=1
eclipse.preferences.version=1
refresh.enabled=true
@@ -1,7 +0,0 @@
#Sun Jun 05 19:03:53 CEST 2011
eclipse.preferences.version=1
org.eclipse.debug.ui.UseContextualLaunch=false
Console.highWaterMark=88000
org.eclipse.debug.ui.PREF_LAUNCH_PERSPECTIVES=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<launchPerspectives/>\r\n
org.eclipse.debug.ui.user_view_bindings=<?xml version\="1.0" encoding\="UTF-8" standalone\="no"?>\r\n<viewBindings>\r\n<view id\="org.eclipse.ui.console.ConsoleView">\r\n<perspective id\="org.eclipse.jdt.ui.JavaPerspective" userAction\="opened"/>\r\n</view>\r\n</viewBindings>\r\n
StringVariablePreferencePage=130,107,107,86,
@@ -1,3 +0,0 @@
#Sun Jun 05 18:58:07 CEST 2011
eclipse.preferences.version=1
org.eclipse.epp.usagedata.gathering.enabled=false
@@ -1,14 +0,0 @@
#Sun Sep 18 16:44:39 NZST 2011
org.eclipse.jdt.core.compiler.compliance=1.6
org.eclipse.jdt.core.compiler.problem.staticAccessReceiver=ignore
org.eclipse.jdt.core.compiler.problem.deprecation=ignore
org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore
org.eclipse.jdt.core.compiler.problem.unusedImport=ignore
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore
org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore
org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=ignore
org.eclipse.jdt.core.compiler.problem.missingSerialVersion=ignore
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
org.eclipse.jdt.core.compiler.source=1.6
@@ -1,4 +0,0 @@
#Sun Jun 05 18:58:05 CEST 2011
spacesForTabs=true
eclipse.preferences.version=1
overviewRuler_migration=migrated_3.1
@@ -1,9 +0,0 @@
#Sun Jun 05 18:58:07 CEST 2011
IMPORT_FILES_AND_FOLDERS_MODE=prompt
IMPORT_FILES_AND_FOLDERS_VIRTUAL_FOLDER_MODE=prompt
SAVE_ALL_BEFORE_BUILD=true
eclipse.preferences.version=1
tipsAndTricks=true
platformState=1287081747687
quickStart=false
PROBLEMS_FILTERS_MIGRATE=true
@@ -1,3 +0,0 @@
#Sun Jun 05 18:50:08 CEST 2011
eclipse.preferences.version=1
showIntro=false
@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/MDKExample"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="GradleStart"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="MDKExample"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xincgc -Xmx1024M -Xms1024M"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc}/run"/>
</launchConfiguration>
@@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchConfiguration type="org.eclipse.jdt.launching.localJavaApplication">
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
<listEntry value="/MDKExample"/>
</listAttribute>
<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
<listEntry value="4"/>
</listAttribute>
<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="GradleStartServer"/>
<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="MDKExample"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xincgc -Xmx1024M -Xms1024M"/>
<stringAttribute key="org.eclipse.jdt.launching.WORKING_DIRECTORY" value="${project_loc}/run"/>
</launchConfiguration>
@@ -1,25 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<launchHistory>
<launchGroup id="org.eclipse.ui.externaltools.launchGroup">
<mruHistory/>
<favorites/>
</launchGroup>
<launchGroup id="org.eclipse.debug.ui.launchGroup.profile">
<mruHistory/>
<favorites/>
</launchGroup>
<launchGroup id="org.eclipse.debug.ui.launchGroup.debug">
<mruHistory>
<launch memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;launchConfiguration local=&quot;true&quot; path=&quot;Client&quot;/&gt;&#13;&#10;"/>
<launch memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;launchConfiguration local=&quot;true&quot; path=&quot;Server&quot;/&gt;&#13;&#10;"/>
</mruHistory>
<favorites/>
</launchGroup>
<launchGroup id="org.eclipse.debug.ui.launchGroup.run">
<mruHistory>
<launch memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;launchConfiguration local=&quot;true&quot; path=&quot;Client&quot;/&gt;&#13;&#10;"/>
<launch memento="&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; standalone=&quot;no&quot;?&gt;&#13;&#10;&lt;launchConfiguration local=&quot;true&quot; path=&quot;Server&quot;/&gt;&#13;&#10;"/>
</mruHistory>
<favorites/>
</launchGroup>
</launchHistory>
+3
View File
@@ -20,3 +20,6 @@ build
# other
eclipse
run
# Files from Forge MDK
forge*changelog.txt
+1
View File
@@ -1,3 +1,4 @@
# Sets default memory used for gradle commands. Can be overridden by user or command line properties.
# This is required to provide enough memory for the Minecraft decompilation process.
org.gradle.jvmargs=-Xmx3G
org.gradle.daemon=false
@@ -5,14 +5,19 @@ import net.minecraft.init.Blocks;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.event.RegistryEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.InterModComms;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.common.event.FMLServerStartingEvent;
import net.minecraftforge.fml.javafmlmod.FMLModLoadingContext;
import net.minecraftforge.fml.event.lifecycle.FMLClientSetupEvent;
import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent;
import net.minecraftforge.fml.event.lifecycle.InterModEnqueueEvent;
import net.minecraftforge.fml.event.lifecycle.InterModProcessEvent;
import net.minecraftforge.fml.event.server.FMLServerStartingEvent;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.stream.Collectors;
// The value here should match an entry in the META-INF/mods.toml file
@Mod("examplemod")
public class ExampleMod
@@ -21,36 +26,59 @@ public class ExampleMod
private static final Logger LOGGER = LogManager.getLogger();
public ExampleMod() {
// Register the preInit method for modloading
FMLModLoadingContext.get().getModEventBus().addListener(this::preInit);
// Register the init method for modloading
FMLModLoadingContext.get().getModEventBus().addListener(this::init);
// Register the setup method for modloading
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
// Register the enqueueIMC method for modloading
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::enqueueIMC);
// Register the processIMC method for modloading
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::processIMC);
// Register the doClientStuff method for modloading
FMLJavaModLoadingContext.get().getModEventBus().addListener(this::doClientStuff);
// Register ourselves for server, registry and other game events we are interested in
// Register ourselves for server and other game events we are interested in
MinecraftForge.EVENT_BUS.register(this);
}
private void preInit(final FMLPreInitializationEvent event)
private void setup(final FMLCommonSetupEvent event)
{
// some preinit code
LOGGER.info("HELLO FROM PREINIT");
}
private void init(final FMLInitializationEvent event)
{
// some example code
LOGGER.info("DIRT BLOCK >> {}", Blocks.DIRT.getRegistryName());
}
@SubscribeEvent
public void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) {
// register a new block here
LOGGER.info("HELLO from Register Block");
private void doClientStuff(final FMLClientSetupEvent event) {
// do something that can only be done on the client
LOGGER.info("Got game settings {}", event.getMinecraftSupplier().get().gameSettings);
}
private void enqueueIMC(final InterModEnqueueEvent event)
{
// some example code to dispatch IMC to another mod
InterModComms.sendTo("examplemod", "helloworld", () -> { LOGGER.info("Hello world from the MDK"); return "Hello world";});
}
private void processIMC(final InterModProcessEvent event)
{
// some example code to receive and process InterModComms from other mods
LOGGER.info("Got IMC {}", event.getIMCStream().
map(m->m.getMessageSupplier().get()).
collect(Collectors.toList()));
}
// You can use SubscribeEvent and let the Event Bus discover methods to call
@SubscribeEvent
public void onServerStarting(FMLServerStartingEvent event) {
// do something when the server starts
LOGGER.info("HELLO from server starting");
}
// You can use EventBusSubscriber to automatically subscribe events on the contained class (this is subscribing to the MOD
// Event bus for receiving Registry Events)
@Mod.EventBusSubscriber(bus=Mod.EventBusSubscriber.Bus.MOD)
public static class RegistryEvents {
@SubscribeEvent
public static void onBlocksRegistry(final RegistryEvent.Register<Block> blockRegistryEvent) {
// register a new block here
LOGGER.info("HELLO from Register Block");
}
}
}
+14 -15
View File
@@ -5,12 +5,20 @@
# Find more information on toml format here: https://github.com/toml-lang/toml
# The name of the mod loader type to load - for regular FML @Mod mods it should be javafml
modLoader="javafml" #mandatory
# A version range to match for said mod loader - for regular FML @Mod it will be the minecraft version (without the 1.)
loaderVersion="[13,)" #mandatory
# A URL to query for updates for this mod. See the JSON update specification <here>
updateJSONURL="http://myurl.me/" #optional
# A version range to match for said mod loader - for regular FML @Mod it will be the forge version
loaderVersion="[25,)" #mandatory (24 is current forge version)
# A URL to refer people to when problems occur with this mod
issueTrackerURL="http://my.issue.tracker/" #optional
# A list of mods - how many allowed here is determined by the individual mod loader
[[mods]] #mandatory
# The modid of the mod
modId="examplemod" #mandatory
# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it
version="${file.jarVersion}" #mandatory
# A display name for the mod
displayName="Example Mod" #mandatory
# A URL to query for updates for this mod. See the JSON update specification <here>
updateJSONURL="http://myurl.me/" #optional
# A URL for the "homepage" for this mod, displayed in the mod UI
displayURL="http://example.com/" #optional
# A file name (in the root of the mod JAR) containing a logo for display
@@ -19,14 +27,6 @@ logoFile="examplemod.png" #optional
credits="Thanks for this example mod goes to Java" #optional
# A text field displayed in the mod UI
authors="Love, Cheese and small house plants" #optional
# A list of mods - how many allowed here is determined by the individual mod loader
[[mods]] #mandatory
# The modid of the mod
modId="examplemod" #mandatory
# The version number of the mod - there's a few well known ${} variables useable here or just hardcode it
version="1.0" #mandatory
# A display name for the mod
displayName="Example Mod" #mandatory
# The description text for the mod (multi line!) (#mandatory)
description='''
This is a long form description of the mod. You can write whatever you want here
@@ -35,7 +35,6 @@ Have some lorem ipsum.
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mollis lacinia magna. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Sed sagittis luctus odio eu tempus. Interdum et malesuada fames ac ante ipsum primis in faucibus. Pellentesque volutpat ligula eget lacus auctor sagittis. In hac habitasse platea dictumst. Nunc gravida elit vitae sem vehicula efficitur. Donec mattis ipsum et arcu lobortis, eleifend sagittis sem rutrum. Cras pharetra quam eget posuere fermentum. Sed id tincidunt justo. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
'''
# A dependency - use the . to indicate dependency for a specific modid. Dependencies are optional.
[[dependencies.examplemod]] #optional
# the modid of the dependency
@@ -43,7 +42,7 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mollis lacinia magn
# Does this dependency have to exist - if not, ordering below must be specified
mandatory=true #mandatory
# The version range of the dependency
versionRange="[14.23.2.0,)" #mandatory
versionRange="[25,)" #mandatory
# An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory
ordering="NONE"
# Side this dependency is applied on - BOTH, CLIENT or SERVER
@@ -52,6 +51,6 @@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed mollis lacinia magn
[[dependencies.examplemod]]
modId="minecraft"
mandatory=true
versionRange="[1.13]"
versionRange="[1.13.2]"
ordering="NONE"
side="BOTH"
-1
View File
@@ -1 +0,0 @@
public net.minecraft.block.Block field_196273_d # LOGGER
+15 -11
View File
@@ -7,7 +7,7 @@ updateJSONURL="http://myurl.me/"
# A URL to refer people to when problems occur with this mod
issueTrackerURL="http://my.issue.tracker/"
# Extra mod loader property
randomScalaProperty=fishy
randomScalaProperty="fishy"
# Arbitrary key-value property pairs available to mods
[properties]
key="value"
@@ -25,13 +25,16 @@ key="value"
This is my mod, there may be
others, but this one is mine
'''
# Override the default resourcelocation namespace with this instead
# Currently not implemented
namespace="invsorter"
# A random extra property for a mod loader
randomExtraProperty=somevalue
randomExtraProperty="somevalue"
# Arbitrary key-value pairs
[inventorysorter.properties]
[modproperties.inventorysorter]
key="value"
# A list of dependencies
[[inventorysorter.dependencies]]
[[dependencies.inventorysorter]]
# the modid of the dependency
modid="forge"
# Does this dependency have to exist - if not, ordering below must be specified
@@ -39,22 +42,23 @@ key="value"
# The version range of the dependency
versionRange="[14.23.2.0,)"
# An ordering relationship for the dependency - BEFORE or AFTER required if the relationship is not mandatory
ordering=NONE
ordering="NONE"
# Side this dependency is applied on - BOTH, CLIENT or SERVER
side=BOTH
side="BOTH"
# Here's another dependency
[[inventorysorter.dependencies]]
[[dependencies.inventorysorter]]
modid="minecraft"
mandatory=true
versionRange="[1.12.2]"
ordering=NONE
side=BOTH
ordering="NONE"
side="BOTH"
# Here's another mod in this jar
[[mods]]
# Note that other mod types may want to add additional key-value pairs in here
modId="inventorysortertoo"
# ${jarVersion} will read the Implementation-Version of the jar file
version="${jarVersion}"
# ${file.jarVersion} will read the Implementation-Version of the jar file
version="${file.jarVersion}"
displayName="Inventory Sorter as well"
description='''
This is also my mod, there may be
@@ -0,0 +1,19 @@
--- a/net/minecraft/advancements/PlayerAdvancements.java
+++ b/net/minecraft/advancements/PlayerAdvancements.java
@@ -174,6 +174,8 @@
}
public boolean func_192750_a(Advancement p_192750_1_, String p_192750_2_) {
+ // Forge: don't grant advancements for fake players
+ if (this.field_192762_j instanceof net.minecraftforge.common.util.FakePlayer) return false;
boolean flag = false;
AdvancementProgress advancementprogress = this.func_192747_a(p_192750_1_);
boolean flag1 = advancementprogress.func_192105_a();
@@ -186,6 +188,7 @@
if (p_192750_1_.func_192068_c() != null && p_192750_1_.func_192068_c().func_193220_i() && this.field_192762_j.field_70170_p.func_82736_K().func_82766_b("announceAdvancements")) {
this.field_192756_d.func_184103_al().func_148539_a(new TextComponentTranslation("chat.type.advancement." + p_192750_1_.func_192068_c().func_192291_d().func_192307_a(), this.field_192762_j.func_145748_c_(), p_192750_1_.func_193123_j()));
}
+ net.minecraftforge.common.ForgeHooks.onAdvancement(this.field_192762_j, p_192750_1_);
}
}
@@ -0,0 +1,38 @@
--- a/net/minecraft/advancements/criterion/ItemPredicate.java
+++ b/net/minecraft/advancements/criterion/ItemPredicate.java
@@ -24,6 +24,8 @@
import net.minecraft.util.registry.IRegistry;
public class ItemPredicate {
+ private static final Map<ResourceLocation, java.util.function.Function<JsonObject, ItemPredicate>> custom_predicates = new java.util.HashMap<>();
+ private static final Map<ResourceLocation, java.util.function.Function<JsonObject, ItemPredicate>> unmod_predicates = java.util.Collections.unmodifiableMap(custom_predicates);
public static final ItemPredicate field_192495_a = new ItemPredicate();
@Nullable
private final Tag<Item> field_200018_b;
@@ -90,6 +92,11 @@
public static ItemPredicate func_192492_a(@Nullable JsonElement p_192492_0_) {
if (p_192492_0_ != null && !p_192492_0_.isJsonNull()) {
JsonObject jsonobject = JsonUtils.func_151210_l(p_192492_0_, "item");
+ if (jsonobject.has("type")) {
+ final ResourceLocation rl = new ResourceLocation(JsonUtils.func_151200_h(jsonobject, "type"));
+ if (custom_predicates.containsKey(rl)) return custom_predicates.get(rl).apply(jsonobject);
+ else throw new JsonSyntaxException("There is no ItemPredicate of type "+rl);
+ }
MinMaxBounds.IntBound minmaxbounds$intbound = MinMaxBounds.IntBound.func_211344_a(jsonobject.get("count"));
MinMaxBounds.IntBound minmaxbounds$intbound1 = MinMaxBounds.IntBound.func_211344_a(jsonobject.get("durability"));
if (jsonobject.has("data")) {
@@ -181,6 +188,14 @@
}
}
+ public static void register(ResourceLocation name, java.util.function.Function<JsonObject, ItemPredicate> deserializer) {
+ custom_predicates.put(name, deserializer);
+ }
+
+ public static Map<ResourceLocation, java.util.function.Function<JsonObject, ItemPredicate>> getPredicates() {
+ return unmod_predicates;
+ }
+
public static class Builder {
private final List<EnchantmentPredicate> field_200312_a = Lists.newArrayList();
@Nullable
@@ -1,15 +1,71 @@
--- a/net/minecraft/block/Block.java
+++ b/net/minecraft/block/Block.java
@@ -74,7 +74,7 @@
@@ -75,9 +75,10 @@
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
-public class Block implements IItemProvider {
+public class Block extends net.minecraftforge.registries.ForgeRegistryEntry<Block> implements IItemProvider, net.minecraftforge.common.extensions.IForgeBlock {
protected static final Logger field_196273_d = LogManager.getLogger();
private static final ResourceLocation field_176230_a = new ResourceLocation("air");
public static final RegistryNamespacedDefaultedByKey<ResourceLocation, Block> field_149771_c = new RegistryNamespacedDefaultedByKey<ResourceLocation, Block>(field_176230_a);
@@ -502,8 +502,8 @@
- public static final ObjectIntIdentityMap<IBlockState> field_176229_d = new ObjectIntIdentityMap<>();
+ @Deprecated //Forge: Do not use, use GameRegistry
+ public static final ObjectIntIdentityMap<IBlockState> field_176229_d = net.minecraftforge.registries.GameData.getBlockStateIDMap();
private static final EnumFacing[] field_212556_a = new EnumFacing[]{EnumFacing.WEST, EnumFacing.EAST, EnumFacing.NORTH, EnumFacing.SOUTH, EnumFacing.DOWN, EnumFacing.UP};
protected final int field_149784_t;
protected final float field_149782_v;
@@ -298,7 +299,7 @@
@Deprecated
public boolean func_196253_a(IBlockState p_196253_1_, BlockItemUseContext p_196253_2_) {
- return this.field_149764_J.func_76222_j() && p_196253_2_.func_195996_i().func_77973_b() != this.func_199767_j();
+ return p_196253_1_.func_185904_a().func_76222_j() && p_196253_2_.func_195996_i().func_77973_b() != this.func_199767_j();
}
@Deprecated
@@ -310,8 +311,9 @@
return this.field_149789_z;
}
+ @Deprecated //Forge: New State sensitive version.
public boolean func_149716_u() {
- return this instanceof ITileEntityProvider;
+ return hasTileEntity(func_176223_P());
}
@Deprecated
@@ -322,11 +324,11 @@
@Deprecated
@OnlyIn(Dist.CLIENT)
public int func_185484_c(IBlockState p_185484_1_, IWorldReader p_185484_2_, BlockPos p_185484_3_) {
- int i = p_185484_2_.func_175626_b(p_185484_3_, p_185484_1_.func_185906_d());
+ int i = p_185484_2_.func_175626_b(p_185484_3_, p_185484_1_.getLightValue(p_185484_2_, p_185484_3_));
if (i == 0 && p_185484_1_.func_177230_c() instanceof BlockSlab) {
p_185484_3_ = p_185484_3_.func_177977_b();
p_185484_1_ = p_185484_2_.func_180495_p(p_185484_3_);
- return p_185484_2_.func_175626_b(p_185484_3_, p_185484_1_.func_185906_d());
+ return p_185484_2_.func_175626_b(p_185484_3_, p_185484_1_.getLightValue(p_185484_2_, p_185484_3_));
} else {
return i;
}
@@ -468,8 +470,17 @@
@Deprecated
public void func_196243_a(IBlockState p_196243_1_, World p_196243_2_, BlockPos p_196243_3_, IBlockState p_196243_4_, boolean p_196243_5_) {
+ // FORGE: Remove modded TEs when the block changes
+ if (hasTileEntity(p_196243_1_) && !(this instanceof BlockContainer // Vanilla ITEP classes, they do this themselves
+ || this instanceof net.minecraft.block.BlockBed
+ || this instanceof net.minecraft.block.BlockRedstoneDiode)) {
+ if (p_196243_1_.func_177230_c() != p_196243_4_.func_177230_c()) {
+ p_196243_2_.func_175713_t(p_196243_3_);
+ }
+ }
}
+ @Deprecated //Forge: Use fortune/location sensitive version
public int func_196264_a(IBlockState p_196264_1_, Random p_196264_2_) {
return 1;
}
@@ -484,30 +495,30 @@
if (f == -1.0F) {
return 0.0F;
} else {
@@ -20,7 +76,75 @@
}
}
@@ -625,6 +625,7 @@
@Deprecated
public void func_196255_a(IBlockState p_196255_1_, World p_196255_2_, BlockPos p_196255_3_, float p_196255_4_, int p_196255_5_) {
- if (!p_196255_2_.field_72995_K) {
- int i = this.func_196251_a(p_196255_1_, p_196255_5_, p_196255_2_, p_196255_3_, p_196255_2_.field_73012_v);
-
- for(int j = 0; j < i; ++j) {
- if (!(p_196255_4_ < 1.0F) || !(p_196255_2_.field_73012_v.nextFloat() > p_196255_4_)) {
- Item item = this.func_199769_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_5_).func_199767_j();
- if (item != Items.field_190931_a) {
- func_180635_a(p_196255_2_, p_196255_3_, new ItemStack(item));
- }
- }
+ if (!p_196255_2_.field_72995_K && !p_196255_2_.restoringBlockSnapshots) { // do not drop items while restoring blockstates, prevents item dupe
+ NonNullList<ItemStack> drops = NonNullList.func_191196_a();
+ getDrops(p_196255_1_, drops, p_196255_2_, p_196255_3_, p_196255_5_);
+ p_196255_4_ = net.minecraftforge.event.ForgeEventFactory.fireBlockHarvesting(drops, p_196255_2_, p_196255_3_, p_196255_1_, p_196255_5_, p_196255_4_, false, harvesters.get());
+ for (ItemStack stack : drops) {
+ if (p_196255_2_.field_73012_v.nextFloat() <= p_196255_4_)
+ func_180635_a(p_196255_2_, p_196255_3_, stack);
}
-
}
}
public static void func_180635_a(World p_180635_0_, BlockPos p_180635_1_, ItemStack p_180635_2_) {
- if (!p_180635_0_.field_72995_K && !p_180635_2_.func_190926_b() && p_180635_0_.func_82736_K().func_82766_b("doTileDrops")) {
+ if (!p_180635_0_.field_72995_K && !p_180635_2_.func_190926_b() && p_180635_0_.func_82736_K().func_82766_b("doTileDrops") && !p_180635_0_.restoringBlockSnapshots) {// do not drop items while restoring blockstates, prevents item dupe
+ if (captureDrops.get()) {
+ capturedDrops.get().add(p_180635_2_);
+ return;
+ }
float f = 0.5F;
double d0 = (double)(p_180635_0_.field_73012_v.nextFloat() * 0.5F) + 0.25D;
double d1 = (double)(p_180635_0_.field_73012_v.nextFloat() * 0.5F) + 0.25D;
@@ -529,6 +540,7 @@
}
+ @Deprecated //Forge: State sensitive version
public float func_149638_a() {
return this.field_149781_w;
}
@@ -543,7 +555,7 @@
}
}
- return raytraceresult;
+ return p_180636_0_.func_177230_c().getRayTraceResult(p_180636_0_, p_180636_1_, p_180636_2_, p_180636_3_, p_180636_4_, raytraceresult);
}
public void func_180652_a(World p_180652_1_, BlockPos p_180652_2_, Explosion p_180652_3_) {
@@ -597,16 +609,22 @@
public void func_180657_a(World p_180657_1_, EntityPlayer p_180657_2_, BlockPos p_180657_3_, IBlockState p_180657_4_, @Nullable TileEntity p_180657_5_, ItemStack p_180657_6_) {
p_180657_2_.func_71029_a(StatList.field_188065_ae.func_199076_b(this));
p_180657_2_.func_71020_j(0.005F);
- if (this.func_149700_E() && EnchantmentHelper.func_77506_a(Enchantments.field_185306_r, p_180657_6_) > 0) {
+ if (this.canSilkHarvest(p_180657_4_, p_180657_1_, p_180657_3_, p_180657_2_) && EnchantmentHelper.func_77506_a(Enchantments.field_185306_r, p_180657_6_) > 0) {
+ NonNullList<ItemStack> items = NonNullList.func_191196_a();
ItemStack itemstack = this.func_180643_i(p_180657_4_);
- func_180635_a(p_180657_1_, p_180657_3_, itemstack);
+ if (!itemstack.func_190926_b()) items.add(itemstack);
+ net.minecraftforge.event.ForgeEventFactory.fireBlockHarvesting(items, p_180657_1_, p_180657_3_, p_180657_4_, 0, 1.0f, true, p_180657_2_);
+ items.forEach(e -> func_180635_a(p_180657_1_, p_180657_3_, e));
} else {
+ harvesters.set(p_180657_2_);
int i = EnchantmentHelper.func_77506_a(Enchantments.field_185308_t, p_180657_6_);
p_180657_4_.func_196949_c(p_180657_1_, p_180657_3_, i);
+ harvesters.set(null);
}
}
@@ -28,7 +152,15 @@
protected boolean func_149700_E() {
return this.func_176223_P().func_185917_h() && !this.func_149716_u();
}
@@ -755,6 +756,7 @@
@@ -663,6 +681,7 @@
p_176216_2_.field_70181_x = 0.0D;
}
+ @Deprecated // Forge: Use more sensitive version below: getPickBlock
public ItemStack func_185473_a(IBlockReader p_185473_1_, BlockPos p_185473_2_, IBlockState p_185473_3_) {
return new ItemStack(this);
}
@@ -737,6 +756,7 @@
}
}
@@ -36,12 +168,44 @@
public SoundType func_185467_w() {
return this.field_149762_H;
}
@@ -1604,4 +1606,56 @@
@@ -758,11 +778,11 @@
}
public static boolean func_196252_e(Block p_196252_0_) {
- return p_196252_0_ == Blocks.field_150348_b || p_196252_0_ == Blocks.field_196650_c || p_196252_0_ == Blocks.field_196654_e || p_196252_0_ == Blocks.field_196656_g;
+ return net.minecraftforge.common.Tags.Blocks.STONE.func_199685_a_(p_196252_0_);
}
public static boolean func_196245_f(Block p_196245_0_) {
- return p_196245_0_ == Blocks.field_150346_d || p_196245_0_ == Blocks.field_196660_k || p_196245_0_ == Blocks.field_196661_l;
+ return net.minecraftforge.common.Tags.Blocks.DIRT.func_199685_a_(p_196245_0_);
}
public static void func_149671_p() {
@@ -1129,7 +1149,7 @@
func_196254_a("chiseled_quartz_block", new Block(Block.Properties.func_200949_a(Material.field_151576_e, MaterialColor.field_151677_p).func_200943_b(0.8F)));
func_196254_a("quartz_pillar", new BlockRotatedPillar(Block.Properties.func_200949_a(Material.field_151576_e, MaterialColor.field_151677_p).func_200943_b(0.8F)));
func_196254_a("quartz_stairs", new BlockStairs(block42.func_176223_P(), Block.Properties.func_200950_a(block42)));
- func_196254_a("activator_rail", new BlockRailPowered(Block.Properties.func_200945_a(Material.field_151594_q).func_200942_a().func_200943_b(0.7F).func_200947_a(SoundType.field_185852_e)));
+ func_196254_a("activator_rail", new BlockRailPowered(Block.Properties.func_200945_a(Material.field_151594_q).func_200942_a().func_200943_b(0.7F).func_200947_a(SoundType.field_185852_e), true));
func_196254_a("dropper", new BlockDropper(Block.Properties.func_200945_a(Material.field_151576_e).func_200943_b(3.5F)));
func_196254_a("white_terracotta", new Block(Block.Properties.func_200949_a(Material.field_151576_e, MaterialColor.field_193561_M).func_200948_a(1.25F, 4.2F)));
func_196254_a("orange_terracotta", new Block(Block.Properties.func_200949_a(Material.field_151576_e, MaterialColor.field_193562_N).func_200948_a(1.25F, 4.2F)));
@@ -1455,6 +1475,7 @@
func_196254_a("bubble_column", new BlockBubbleColumn(Block.Properties.func_200945_a(Material.field_203244_i).func_200942_a()));
func_196254_a("structure_block", new BlockStructure(Block.Properties.func_200949_a(Material.field_151573_f, MaterialColor.field_197656_x).func_200948_a(-1.0F, 3600000.0F)));
+ if(false) // Processed in GameData.BlockCallbacks#onBake
for(Block block85 : IRegistry.field_212618_g) {
for(IBlockState iblockstate : block85.func_176194_O().func_177619_a()) {
field_176229_d.func_195867_b(iblockstate);
@@ -1594,4 +1615,83 @@
return Objects.hash(this.field_212164_a, this.field_212165_b, this.field_212166_c);
}
}
+ /* ======================================== FORGE START =====================================*/
+ private ThreadLocal<IBlockState> silkCheck = new ThreadLocal<>();
+ protected Random RANDOM = new Random();
+ protected ThreadLocal<EntityPlayer> harvesters = new ThreadLocal<>();
+ private net.minecraftforge.common.ToolType harvestTool;
+ private int harvestLevel;
+ protected static ThreadLocal<Boolean> captureDrops = ThreadLocal.withInitial(() -> false);
@@ -68,12 +232,6 @@
+ return this.func_149700_E() && !state.hasTileEntity();
+ }
+
+ @Override
+ public void onBlockExploded(IBlockState state, World world, BlockPos pos, Explosion explosion) {
+ world.func_175698_g(pos);
+ func_180652_a(world, pos, explosion);
+ }
+
+ @Nullable
+ @Override
+ public net.minecraftforge.common.ToolType getHarvestTool(IBlockState state) {
@@ -85,6 +243,38 @@
+ return harvestLevel; //TODO: RE-Evaluate
+ }
+
+ @Override
+ public boolean canSustainPlant(IBlockState state, IBlockReader world, BlockPos pos, EnumFacing facing, net.minecraftforge.common.IPlantable plantable) {
+ IBlockState plant = plantable.getPlant(world, pos.func_177972_a(facing));
+ net.minecraftforge.common.EnumPlantType type = plantable.getPlantType(world, pos.func_177972_a(facing));
+
+ if (plant.func_177230_c() == Blocks.field_150434_aF)
+ return this.getBlock() == Blocks.field_150434_aF || this.getBlock() == Blocks.field_150354_m || this.getBlock() == Blocks.field_196611_F;
+
+ if (plant.func_177230_c() == Blocks.field_196608_cF && this == Blocks.field_196608_cF)
+ return true;
+
+ if (plantable instanceof BlockBush && ((BlockBush)plantable).func_200014_a_(state, world, pos))
+ return true;
+
+ switch (type) {
+ case Desert: return this.getBlock() == Blocks.field_150354_m || this.getBlock() == Blocks.field_150405_ch || this.getBlock() instanceof BlockGlazedTerracotta;
+ case Nether: return this.getBlock() == Blocks.field_150425_aM;
+ case Crop: return this.getBlock() == Blocks.field_150458_ak;
+ case Cave: return state.func_185896_q();
+ case Plains: return this.getBlock() == Blocks.field_196658_i || Block.func_196245_f(this) || this.getBlock() == Blocks.field_150458_ak;
+ case Water: return state.func_185904_a() == Material.field_151586_h; //&& state.getValue(BlockLiquidWrapper)
+ case Beach:
+ boolean isBeach = this.getBlock() == Blocks.field_196658_i || Block.func_196245_f(this) || this.getBlock() == Blocks.field_150354_m;
+ boolean hasWater = (world.func_180495_p(pos.func_177974_f()).func_185904_a() == Material.field_151586_h ||
+ world.func_180495_p(pos.func_177976_e()).func_185904_a() == Material.field_151586_h ||
+ world.func_180495_p(pos.func_177978_c()).func_185904_a() == Material.field_151586_h ||
+ world.func_180495_p(pos.func_177968_d()).func_185904_a() == Material.field_151586_h);
+ return isBeach && hasWater;
+ }
+ return false;
+ }
+
+ static {
+ net.minecraftforge.common.ForgeHooks.setBlockToolSetter((block, tool, level) -> {
+ block.harvestTool = tool;
@@ -0,0 +1,22 @@
--- a/net/minecraft/block/BlockAbstractBanner.java
+++ b/net/minecraft/block/BlockAbstractBanner.java
@@ -51,7 +51,7 @@
}
public void func_196255_a(IBlockState p_196255_1_, World p_196255_2_, BlockPos p_196255_3_, float p_196255_4_, int p_196255_5_) {
- func_180635_a(p_196255_2_, p_196255_3_, this.func_185473_a(p_196255_2_, p_196255_3_, p_196255_1_));
+ super.func_196255_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_4_, p_196255_5_);
}
public void func_180657_a(World p_180657_1_, EntityPlayer p_180657_2_, BlockPos p_180657_3_, IBlockState p_180657_4_, @Nullable TileEntity p_180657_5_, ItemStack p_180657_6_) {
@@ -75,4 +75,10 @@
public EnumDyeColor func_196285_M_() {
return this.field_196286_a;
}
+
+ @Override
+ public void getDrops(IBlockState state, net.minecraft.util.NonNullList<ItemStack> drops, World world, BlockPos pos, int fortune) {
+ TileEntity te = world.func_175625_s(pos);
+ drops.add((te instanceof TileEntityBanner) ? ((TileEntityBanner)te).func_190615_l(state) : func_185473_a(world, pos, state));
+ }
}
@@ -0,0 +1,52 @@
--- a/net/minecraft/block/BlockAbstractSkull.java
+++ b/net/minecraft/block/BlockAbstractSkull.java
@@ -38,6 +38,7 @@
}
public void func_196255_a(IBlockState p_196255_1_, World p_196255_2_, BlockPos p_196255_3_, float p_196255_4_, int p_196255_5_) {
+ super.func_196255_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_4_, p_196255_5_);
}
public void func_176208_a(World p_176208_1_, BlockPos p_176208_2_, IBlockState p_176208_3_, EntityPlayer p_176208_4_) {
@@ -45,6 +46,7 @@
TileEntitySkull.func_195486_a(p_176208_1_, p_176208_2_);
}
+ this.func_196255_a(p_176208_3_, p_176208_1_, p_176208_2_, 1.0f, 0);
super.func_176208_a(p_176208_1_, p_176208_2_, p_176208_3_, p_176208_4_);
}
@@ -55,7 +57,7 @@
public void func_196243_a(IBlockState p_196243_1_, World p_196243_2_, BlockPos p_196243_3_, IBlockState p_196243_4_, boolean p_196243_5_) {
if (p_196243_1_.func_177230_c() != p_196243_4_.func_177230_c() && !p_196243_2_.field_72995_K) {
TileEntity tileentity = p_196243_2_.func_175625_s(p_196243_3_);
- if (tileentity instanceof TileEntitySkull) {
+ if (false && tileentity instanceof TileEntitySkull) { //Forge: Moved to getDrops
TileEntitySkull tileentityskull = (TileEntitySkull)tileentity;
if (tileentityskull.func_195487_d()) {
ItemStack itemstack = this.func_185473_a(p_196243_2_, p_196243_3_, p_196243_1_);
@@ -74,6 +76,24 @@
}
}
+ @Override
+ public void getDrops(IBlockState state, net.minecraft.util.NonNullList<ItemStack> drops, World world, BlockPos pos, int fortune) {
+ TileEntity te = world.func_175625_s(pos);
+ if (te instanceof TileEntitySkull) {
+ TileEntitySkull skull = (TileEntitySkull)te;
+ if (skull.func_195487_d()) {
+ ItemStack ret = func_185473_a(world, pos, state);
+ Block block = skull.func_195044_w().func_177230_c();
+ if ((block == Blocks.field_196710_eS || block == Blocks.field_196709_eR) && skull.func_152108_a() != null) {
+ NBTTagCompound nbt = new NBTTagCompound();
+ NBTUtil.func_180708_a(nbt, skull.func_152108_a());
+ ret.func_196082_o().func_74782_a("SkullOwner", nbt);
+ }
+ drops.add(ret);
+ }
+ }
+ }
+
@OnlyIn(Dist.CLIENT)
public BlockSkull.ISkullType func_196292_N_() {
return this.field_196293_a;
@@ -0,0 +1,13 @@
--- a/net/minecraft/block/BlockBed.java
+++ b/net/minecraft/block/BlockBed.java
@@ -67,7 +67,9 @@
}
}
- if (p_196250_2_.field_73011_w.func_76567_e() && p_196250_2_.func_180494_b(p_196250_3_) != Biomes.field_76778_j) {
+ net.minecraftforge.common.extensions.IForgeDimension.SleepResult sleepResult = p_196250_2_.field_73011_w.canSleepAt(p_196250_4_, p_196250_3_);
+ if (sleepResult != net.minecraftforge.common.extensions.IForgeDimension.SleepResult.BED_EXPLODES) {
+ if (sleepResult == net.minecraftforge.common.extensions.IForgeDimension.SleepResult.DENY) return true;
if (p_196250_1_.func_177229_b(field_176471_b)) {
EntityPlayer entityplayer = this.func_176470_e(p_196250_2_, p_196250_3_);
if (entityplayer != null) {
@@ -0,0 +1,32 @@
--- a/net/minecraft/block/BlockBush.java
+++ b/net/minecraft/block/BlockBush.java
@@ -10,7 +10,7 @@
import net.minecraft.world.IWorld;
import net.minecraft.world.IWorldReaderBase;
-public class BlockBush extends Block {
+public class BlockBush extends Block implements net.minecraftforge.common.IPlantable {
protected BlockBush(Block.Properties p_i48437_1_) {
super(p_i48437_1_);
}
@@ -26,6 +26,8 @@
public boolean func_196260_a(IBlockState p_196260_1_, IWorldReaderBase p_196260_2_, BlockPos p_196260_3_) {
BlockPos blockpos = p_196260_3_.func_177977_b();
+ if (p_196260_1_.func_177230_c() == this) //Forge: This function is called during world gen and placement, before this block is set, so if we are not 'here' then assume it's the pre-check.
+ return p_196260_2_.func_180495_p(blockpos).canSustainPlant(p_196260_2_, blockpos, EnumFacing.UP, this);
return this.func_200014_a_(p_196260_2_.func_180495_p(blockpos), p_196260_2_, blockpos);
}
@@ -44,4 +46,11 @@
public int func_200011_d(IBlockState p_200011_1_, IBlockReader p_200011_2_, BlockPos p_200011_3_) {
return 0;
}
+
+ @Override
+ public IBlockState getPlant(IBlockReader world, BlockPos pos) {
+ IBlockState state = world.func_180495_p(pos);
+ if (state.func_177230_c() != this) return func_176223_P();
+ return state;
+ }
}
@@ -0,0 +1,63 @@
--- a/net/minecraft/block/BlockCactus.java
+++ b/net/minecraft/block/BlockCactus.java
@@ -21,7 +21,7 @@
import net.minecraft.world.IWorldReaderBase;
import net.minecraft.world.World;
-public class BlockCactus extends Block {
+public class BlockCactus extends Block implements net.minecraftforge.common.IPlantable {
public static final IntegerProperty field_176587_a = BlockStateProperties.field_208171_X;
protected static final VoxelShape field_196400_b = Block.func_208617_a(1.0D, 0.0D, 1.0D, 15.0D, 15.0D, 15.0D);
protected static final VoxelShape field_196401_c = Block.func_208617_a(1.0D, 0.0D, 1.0D, 15.0D, 16.0D, 15.0D);
@@ -32,6 +32,7 @@
}
public void func_196267_b(IBlockState p_196267_1_, World p_196267_2_, BlockPos p_196267_3_, Random p_196267_4_) {
+ if (!p_196267_2_.func_205050_e(p_196267_3_, 1)) return; // Forge: prevent growing cactus from loading unloaded chunks with block update
if (!p_196267_1_.func_196955_c(p_196267_2_, p_196267_3_)) {
p_196267_2_.func_175655_b(p_196267_3_, true);
} else {
@@ -44,6 +45,7 @@
if (i < 3) {
int j = p_196267_1_.func_177229_b(field_176587_a);
+ if(net.minecraftforge.common.ForgeHooks.onCropsGrowPre(p_196267_2_, blockpos, p_196267_1_, true)) {
if (j == 15) {
p_196267_2_.func_175656_a(blockpos, this.func_176223_P());
IBlockState iblockstate = p_196267_1_.func_206870_a(field_176587_a, Integer.valueOf(0));
@@ -52,7 +54,8 @@
} else {
p_196267_2_.func_180501_a(p_196267_3_, p_196267_1_.func_206870_a(field_176587_a, Integer.valueOf(j + 1)), 4);
}
-
+ net.minecraftforge.common.ForgeHooks.onCropsGrowPost(p_196267_2_, p_196267_3_, p_196267_1_);
+ }
}
}
}
@@ -91,8 +94,8 @@
}
}
- Block block = p_196260_2_.func_180495_p(p_196260_3_.func_177977_b()).func_177230_c();
- return (block == Blocks.field_150434_aF || block == Blocks.field_150354_m || block == Blocks.field_196611_F) && !p_196260_2_.func_180495_p(p_196260_3_.func_177984_a()).func_185904_a().func_76224_d();
+ IBlockState soil = p_196260_2_.func_180495_p(p_196260_3_.func_177977_b());
+ return soil.canSustainPlant(p_196260_2_, p_196260_3_.func_177977_b(), EnumFacing.UP, this) && !p_196260_2_.func_180495_p(p_196260_3_.func_177984_a()).func_185904_a().func_76224_d();
}
public void func_196262_a(IBlockState p_196262_1_, World p_196262_2_, BlockPos p_196262_3_, Entity p_196262_4_) {
@@ -114,4 +117,14 @@
public boolean func_196266_a(IBlockState p_196266_1_, IBlockReader p_196266_2_, BlockPos p_196266_3_, PathType p_196266_4_) {
return false;
}
+
+ @Override
+ public net.minecraftforge.common.EnumPlantType getPlantType(IBlockReader world, BlockPos pos) {
+ return net.minecraftforge.common.EnumPlantType.Desert;
+ }
+
+ @Override
+ public IBlockState getPlant(IBlockReader world, BlockPos pos) {
+ return func_176223_P();
+ }
}
@@ -0,0 +1,11 @@
--- a/net/minecraft/block/BlockChest.java
+++ b/net/minecraft/block/BlockChest.java
@@ -258,7 +258,7 @@
}
private boolean func_176456_n(IBlockReader p_176456_1_, BlockPos p_176456_2_) {
- return p_176456_1_.func_180495_p(p_176456_2_.func_177984_a()).func_185915_l();
+ return p_176456_1_.func_180495_p(p_176456_2_.func_177984_a()).doesSideBlockChestOpening(p_176456_1_, p_176456_2_.func_177984_a(), EnumFacing.DOWN);
}
private boolean func_176453_o(World p_176453_1_, BlockPos p_176453_2_) {
@@ -0,0 +1,20 @@
--- a/net/minecraft/block/BlockChorusFlower.java
+++ b/net/minecraft/block/BlockChorusFlower.java
@@ -42,7 +42,7 @@
BlockPos blockpos = p_196267_3_.func_177984_a();
if (p_196267_2_.func_175623_d(blockpos) && blockpos.func_177956_o() < 256) {
int i = p_196267_1_.func_177229_b(field_185607_a);
- if (i < 5) {
+ if (i < 5 && net.minecraftforge.common.ForgeHooks.onCropsGrowPre(p_196267_2_, blockpos, p_196267_1_, true)) {
boolean flag = false;
boolean flag1 = false;
IBlockState iblockstate = p_196267_2_.func_180495_p(p_196267_3_.func_177977_b());
@@ -99,7 +99,7 @@
} else {
this.func_185605_c(p_196267_2_, p_196267_3_);
}
-
+ net.minecraftforge.common.ForgeHooks.onCropsGrowPost(p_196267_2_, p_196267_3_, p_196267_1_);
}
}
}
@@ -0,0 +1,39 @@
--- a/net/minecraft/block/BlockCocoa.java
+++ b/net/minecraft/block/BlockCocoa.java
@@ -34,10 +34,11 @@
}
public void func_196267_b(IBlockState p_196267_1_, World p_196267_2_, BlockPos p_196267_3_, Random p_196267_4_) {
- if (p_196267_2_.field_73012_v.nextInt(5) == 0) {
+ if (true) {
int i = p_196267_1_.func_177229_b(field_176501_a);
- if (i < 2) {
+ if (i < 2 && net.minecraftforge.common.ForgeHooks.onCropsGrowPre(p_196267_2_, p_196267_3_, p_196267_1_, p_196267_2_.field_73012_v.nextInt(5) == 0)) {
p_196267_2_.func_180501_a(p_196267_3_, p_196267_1_.func_206870_a(field_176501_a, Integer.valueOf(i + 1)), 2);
+ net.minecraftforge.common.ForgeHooks.onCropsGrowPost(p_196267_2_, p_196267_3_, p_196267_1_);
}
}
@@ -90,14 +91,20 @@
}
public void func_196255_a(IBlockState p_196255_1_, World p_196255_2_, BlockPos p_196255_3_, float p_196255_4_, int p_196255_5_) {
- int i = p_196255_1_.func_177229_b(field_176501_a);
+ super.func_196255_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_4_, p_196255_5_);
+ }
+
+ @Override
+ public void getDrops(IBlockState state, net.minecraft.util.NonNullList<ItemStack> drops, World world, BlockPos pos, int fortune) {
+ super.getDrops(state, drops, world, pos, fortune);
+ int i = state.func_177229_b(field_176501_a);
int j = 1;
if (i >= 2) {
j = 3;
}
for(int k = 0; k < j; ++k) {
- func_180635_a(p_196255_2_, p_196255_3_, new ItemStack(Items.field_196130_bo));
+ drops.add(new ItemStack(Items.field_196130_bo));
}
}
@@ -0,0 +1,57 @@
--- a/net/minecraft/block/BlockCrops.java
+++ b/net/minecraft/block/BlockCrops.java
@@ -55,12 +55,14 @@
public void func_196267_b(IBlockState p_196267_1_, World p_196267_2_, BlockPos p_196267_3_, Random p_196267_4_) {
super.func_196267_b(p_196267_1_, p_196267_2_, p_196267_3_, p_196267_4_);
+ if (!p_196267_2_.func_205050_e(p_196267_3_, 1)) return; // Forge: prevent loading unloaded chunks when checking neighbor's light
if (p_196267_2_.func_201669_a(p_196267_3_.func_177984_a(), 0) >= 9) {
int i = this.func_185527_x(p_196267_1_);
if (i < this.func_185526_g()) {
float f = func_180672_a(this, p_196267_2_, p_196267_3_);
- if (p_196267_4_.nextInt((int)(25.0F / f) + 1) == 0) {
+ if (net.minecraftforge.common.ForgeHooks.onCropsGrowPre(p_196267_2_, p_196267_3_, p_196267_1_, p_196267_4_.nextInt((int)(25.0F / f) + 1) == 0)) {
p_196267_2_.func_180501_a(p_196267_3_, this.func_185528_e(i + 1), 2);
+ net.minecraftforge.common.ForgeHooks.onCropsGrowPost(p_196267_2_, p_196267_3_, p_196267_1_);
}
}
}
@@ -89,9 +91,9 @@
for(int j = -1; j <= 1; ++j) {
float f1 = 0.0F;
IBlockState iblockstate = p_180672_1_.func_180495_p(blockpos.func_177982_a(i, 0, j));
- if (iblockstate.func_177230_c() == Blocks.field_150458_ak) {
+ if (iblockstate.canSustainPlant(p_180672_1_, blockpos.func_177982_a(i, 0, j), net.minecraft.util.EnumFacing.UP, (net.minecraftforge.common.IPlantable)p_180672_0_)) {
f1 = 1.0F;
- if (iblockstate.func_177229_b(BlockFarmland.field_176531_a) > 0) {
+ if (iblockstate.isFertile(p_180672_1_, blockpos.func_177982_a(i, 0, j))) {
f1 = 3.0F;
}
}
@@ -135,15 +137,20 @@
}
public void func_196255_a(IBlockState p_196255_1_, World p_196255_2_, BlockPos p_196255_3_, float p_196255_4_, int p_196255_5_) {
- super.func_196255_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_4_, 0);
- if (!p_196255_2_.field_72995_K) {
- int i = this.func_185527_x(p_196255_1_);
+ super.func_196255_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_4_, p_196255_5_);
+ }
+
+ @Override
+ public void getDrops(IBlockState state, net.minecraft.util.NonNullList<ItemStack> drops, World world, BlockPos pos, int fortune) {
+ super.getDrops(state, drops, world, pos, 0);
+ {
+ int i = this.func_185527_x(state);
if (i >= this.func_185526_g()) {
- int j = 3 + p_196255_5_;
+ int j = 3 + fortune;
for(int k = 0; k < j; ++k) {
- if (p_196255_2_.field_73012_v.nextInt(2 * this.func_185526_g()) <= i) {
- func_180635_a(p_196255_2_, p_196255_3_, new ItemStack(this.func_199772_f()));
+ if (world.field_73012_v.nextInt(2 * this.func_185526_g()) <= i) {
+ drops.add(new ItemStack(this.func_199772_f()));
}
}
}
@@ -0,0 +1,22 @@
--- a/net/minecraft/block/BlockDeadBush.java
+++ b/net/minecraft/block/BlockDeadBush.java
@@ -14,7 +14,7 @@
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
-public class BlockDeadBush extends BlockBush {
+public class BlockDeadBush extends BlockBush implements net.minecraftforge.common.IShearable {
protected static final VoxelShape field_196397_a = Block.func_208617_a(2.0D, 0.0D, 2.0D, 14.0D, 13.0D, 14.0D);
protected BlockDeadBush(Block.Properties p_i48418_1_) {
@@ -46,4 +46,10 @@
super.func_180657_a(p_180657_1_, p_180657_2_, p_180657_3_, flag ? Blocks.field_150350_a.func_176223_P() : p_180657_4_, p_180657_5_, p_180657_6_);
}
+
+ @Override
+ public java.util.List<ItemStack> onSheared(ItemStack item, net.minecraft.world.IWorld world, BlockPos pos, int fortune) {
+ world.func_180501_a(pos, Blocks.field_150350_a.func_176223_P(), 11);
+ return java.util.Arrays.asList(new ItemStack(Blocks.field_196555_aI));
+ }
}
@@ -0,0 +1,10 @@
--- a/net/minecraft/block/BlockDirtSnowySpreadable.java
+++ b/net/minecraft/block/BlockDirtSnowySpreadable.java
@@ -25,6 +25,7 @@
public void func_196267_b(IBlockState p_196267_1_, World p_196267_2_, BlockPos p_196267_3_, Random p_196267_4_) {
if (!p_196267_2_.field_72995_K) {
+ if (!p_196267_2_.func_205050_e(p_196267_3_, 3)) return; // Forge: prevent loading unloaded chunks when checking neighbor's light and spreading
if (!func_196383_a(p_196267_2_, p_196267_3_)) {
p_196267_2_.func_175656_a(p_196267_3_, Blocks.field_150346_d.func_176223_P());
} else {
@@ -0,0 +1,19 @@
--- a/net/minecraft/block/BlockDoublePlant.java
+++ b/net/minecraft/block/BlockDoublePlant.java
@@ -43,7 +43,7 @@
@Nullable
public IBlockState func_196258_a(BlockItemUseContext p_196258_1_) {
BlockPos blockpos = p_196258_1_.func_195995_a();
- return blockpos.func_177956_o() < 255 && p_196258_1_.func_195991_k().func_180495_p(blockpos.func_177984_a()).func_196953_a(p_196258_1_) ? super.func_196258_a(p_196258_1_) : null;
+ return blockpos.func_177956_o() < p_196258_1_.func_195991_k().func_72800_K() - 1 && p_196258_1_.func_195991_k().func_180495_p(blockpos.func_177984_a()).func_196953_a(p_196258_1_) ? super.func_196258_a(p_196258_1_) : null;
}
public void func_180633_a(World p_180633_1_, BlockPos p_180633_2_, IBlockState p_180633_3_, EntityLivingBase p_180633_4_, ItemStack p_180633_5_) {
@@ -51,6 +51,7 @@
}
public boolean func_196260_a(IBlockState p_196260_1_, IWorldReaderBase p_196260_2_, BlockPos p_196260_3_) {
+ if (p_196260_1_.func_177230_c() != this) return super.func_196260_a(p_196260_1_, p_196260_2_, p_196260_3_); //Forge: This function is called during world gen and placement, before this block is set, so if we are not 'here' then assume it's the pre-check.
if (p_196260_1_.func_177229_b(field_176492_b) != DoubleBlockHalf.UPPER) {
return super.func_196260_a(p_196260_1_, p_196260_2_, p_196260_3_);
} else {
@@ -0,0 +1,11 @@
--- a/net/minecraft/block/BlockDropper.java
+++ b/net/minecraft/block/BlockDropper.java
@@ -37,7 +37,7 @@
p_176439_1_.func_175718_b(1001, p_176439_2_, 0);
} else {
ItemStack itemstack = tileentitydispenser.func_70301_a(i);
- if (!itemstack.func_190926_b()) {
+ if (!itemstack.func_190926_b() && net.minecraftforge.items.VanillaInventoryCodeHooks.dropperInsertHook(p_176439_1_, p_176439_2_, tileentitydispenser, i, itemstack)) {
EnumFacing enumfacing = p_176439_1_.func_180495_p(p_176439_2_).func_177229_b(field_176441_a);
IInventory iinventory = TileEntityHopper.func_195484_a(p_176439_1_, p_176439_2_.func_177972_a(enumfacing));
ItemStack itemstack1;
@@ -0,0 +1,11 @@
--- a/net/minecraft/block/BlockEnchantmentTable.java
+++ b/net/minecraft/block/BlockEnchantmentTable.java
@@ -49,7 +49,7 @@
if (p_180655_4_.nextInt(16) == 0) {
for(int k = 0; k <= 1; ++k) {
BlockPos blockpos = p_180655_3_.func_177982_a(i, k, j);
- if (p_180655_2_.func_180495_p(blockpos).func_177230_c() == Blocks.field_150342_X) {
+ if (p_180655_2_.func_180495_p(blockpos).getEnchantPowerBonus(p_180655_2_, p_180655_3_) > 0) {
if (!p_180655_2_.func_175623_d(p_180655_3_.func_177982_a(i / 2, 0, j / 2))) {
break;
}
@@ -0,0 +1,21 @@
--- a/net/minecraft/block/BlockEnderChest.java
+++ b/net/minecraft/block/BlockEnderChest.java
@@ -81,7 +81,7 @@
InventoryEnderChest inventoryenderchest = p_196250_4_.func_71005_bN();
TileEntity tileentity = p_196250_2_.func_175625_s(p_196250_3_);
if (inventoryenderchest != null && tileentity instanceof TileEntityEnderChest) {
- if (p_196250_2_.func_180495_p(p_196250_3_.func_177984_a()).func_185915_l()) {
+ if (p_196250_2_.func_180495_p(p_196250_3_.func_177984_a()).doesSideBlockChestOpening(p_196250_2_, p_196250_3_.func_177984_a(), EnumFacing.DOWN)) {
return true;
} else if (p_196250_2_.field_72995_K) {
return true;
@@ -173,4 +173,9 @@
public boolean func_196266_a(IBlockState p_196266_1_, IBlockReader p_196266_2_, BlockPos p_196266_3_, PathType p_196266_4_) {
return false;
}
+
+ @Override
+ public boolean canSilkHarvest(IBlockState state, net.minecraft.world.IWorldReader world, BlockPos pos, EntityPlayer player) {
+ return true;
+ }
}
@@ -0,0 +1,21 @@
--- a/net/minecraft/block/BlockFalling.java
+++ b/net/minecraft/block/BlockFalling.java
@@ -48,7 +48,9 @@
p_176503_1_.func_72838_d(entityfallingblock);
}
} else {
+ IBlockState state = func_176223_P();
if (p_176503_1_.func_180495_p(p_176503_2_).func_177230_c() == this) {
+ state = p_176503_1_.func_180495_p(p_176503_2_);
p_176503_1_.func_175698_g(p_176503_2_);
}
@@ -58,7 +60,7 @@
}
if (blockpos.func_177956_o() > 0) {
- p_176503_1_.func_175656_a(blockpos.func_177984_a(), this.func_176223_P());
+ p_176503_1_.func_175656_a(blockpos.func_177984_a(), state); //Forge: Fix loss of state information during world gen.
}
}
@@ -0,0 +1,33 @@
--- a/net/minecraft/block/BlockFarmland.java
+++ b/net/minecraft/block/BlockFarmland.java
@@ -79,7 +79,7 @@
}
public void func_180658_a(World p_180658_1_, BlockPos p_180658_2_, Entity p_180658_3_, float p_180658_4_) {
- if (!p_180658_1_.field_72995_K && p_180658_1_.field_73012_v.nextFloat() < p_180658_4_ - 0.5F && p_180658_3_ instanceof EntityLivingBase && (p_180658_3_ instanceof EntityPlayer || p_180658_1_.func_82736_K().func_82766_b("mobGriefing")) && p_180658_3_.field_70130_N * p_180658_3_.field_70130_N * p_180658_3_.field_70131_O > 0.512F) {
+ if (!p_180658_1_.field_72995_K && net.minecraftforge.common.ForgeHooks.onFarmlandTrample(p_180658_1_, p_180658_2_, Blocks.field_150346_d.func_176223_P(), p_180658_4_, p_180658_3_)) { // Forge: Move logic to Entity#canTrample
func_199610_d(p_180658_1_.func_180495_p(p_180658_2_), p_180658_1_, p_180658_2_);
}
@@ -90,9 +90,9 @@
p_199610_1_.func_175656_a(p_199610_2_, func_199601_a(p_199610_0_, Blocks.field_150346_d.func_176223_P(), p_199610_1_, p_199610_2_));
}
- private static boolean func_176529_d(IBlockReader p_176529_0_, BlockPos p_176529_1_) {
- Block block = p_176529_0_.func_180495_p(p_176529_1_.func_177984_a()).func_177230_c();
- return block instanceof BlockCrops || block instanceof BlockStem || block instanceof BlockAttachedStem;
+ private boolean func_176529_d(IBlockReader p_176529_0_, BlockPos p_176529_1_) {
+ IBlockState state = p_176529_0_.func_180495_p(p_176529_1_.func_177984_a());
+ return state.func_177230_c() instanceof net.minecraftforge.common.IPlantable && canSustainPlant(state, p_176529_0_, p_176529_1_, EnumFacing.UP, (net.minecraftforge.common.IPlantable)state.func_177230_c());
}
private static boolean func_176530_e(IWorldReaderBase p_176530_0_, BlockPos p_176530_1_) {
@@ -102,7 +102,7 @@
}
}
- return false;
+ return net.minecraftforge.common.FarmlandWaterManager.hasBlockWaterTicket(p_176530_0_, p_176530_1_);
}
public IItemProvider func_199769_a(IBlockState p_199769_1_, World p_199769_2_, BlockPos p_199769_3_, int p_199769_4_) {
@@ -0,0 +1,50 @@
--- a/net/minecraft/block/BlockFence.java
+++ b/net/minecraft/block/BlockFence.java
@@ -64,15 +64,12 @@
IBlockReader iblockreader = p_196258_1_.func_195991_k();
BlockPos blockpos = p_196258_1_.func_195995_a();
IFluidState ifluidstate = p_196258_1_.func_195991_k().func_204610_c(p_196258_1_.func_195995_a());
- BlockPos blockpos1 = blockpos.func_177978_c();
- BlockPos blockpos2 = blockpos.func_177974_f();
- BlockPos blockpos3 = blockpos.func_177968_d();
- BlockPos blockpos4 = blockpos.func_177976_e();
- IBlockState iblockstate = iblockreader.func_180495_p(blockpos1);
- IBlockState iblockstate1 = iblockreader.func_180495_p(blockpos2);
- IBlockState iblockstate2 = iblockreader.func_180495_p(blockpos3);
- IBlockState iblockstate3 = iblockreader.func_180495_p(blockpos4);
- return super.func_196258_a(p_196258_1_).func_206870_a(field_196409_a, Boolean.valueOf(this.func_196416_a(iblockstate, iblockstate.func_193401_d(iblockreader, blockpos1, EnumFacing.SOUTH)))).func_206870_a(field_196411_b, Boolean.valueOf(this.func_196416_a(iblockstate1, iblockstate1.func_193401_d(iblockreader, blockpos2, EnumFacing.WEST)))).func_206870_a(field_196413_c, Boolean.valueOf(this.func_196416_a(iblockstate2, iblockstate2.func_193401_d(iblockreader, blockpos3, EnumFacing.NORTH)))).func_206870_a(field_196414_y, Boolean.valueOf(this.func_196416_a(iblockstate3, iblockstate3.func_193401_d(iblockreader, blockpos4, EnumFacing.EAST)))).func_206870_a(field_204514_u, Boolean.valueOf(ifluidstate.func_206886_c() == Fluids.field_204546_a));
+ return super.func_196258_a(p_196258_1_)
+ .func_206870_a(field_196409_a, canFenceConnectTo(iblockreader, blockpos, EnumFacing.NORTH))
+ .func_206870_a(field_196411_b, canFenceConnectTo(iblockreader, blockpos, EnumFacing.EAST))
+ .func_206870_a(field_196413_c, canFenceConnectTo(iblockreader, blockpos, EnumFacing.SOUTH))
+ .func_206870_a(field_196414_y, canFenceConnectTo(iblockreader, blockpos, EnumFacing.WEST))
+ .func_206870_a(field_204514_u, Boolean.valueOf(ifluidstate.func_206886_c() == Fluids.field_204546_a));
}
public IBlockState func_196271_a(IBlockState p_196271_1_, EnumFacing p_196271_2_, IBlockState p_196271_3_, IWorld p_196271_4_, BlockPos p_196271_5_, BlockPos p_196271_6_) {
@@ -80,7 +77,7 @@
p_196271_4_.func_205219_F_().func_205360_a(p_196271_5_, Fluids.field_204546_a, Fluids.field_204546_a.func_205569_a(p_196271_4_));
}
- return p_196271_2_.func_176740_k().func_176716_d() == EnumFacing.Plane.HORIZONTAL ? p_196271_1_.func_206870_a(field_196415_z.get(p_196271_2_), Boolean.valueOf(this.func_196416_a(p_196271_3_, p_196271_3_.func_193401_d(p_196271_4_, p_196271_6_, p_196271_2_.func_176734_d())))) : super.func_196271_a(p_196271_1_, p_196271_2_, p_196271_3_, p_196271_4_, p_196271_5_, p_196271_6_);
+ return p_196271_2_.func_176740_k().func_176716_d() == EnumFacing.Plane.HORIZONTAL ? p_196271_1_.func_206870_a(field_196415_z.get(p_196271_2_), Boolean.valueOf(this.canFenceConnectTo(p_196271_4_, p_196271_5_, p_196271_2_))) : super.func_196271_a(p_196271_1_, p_196271_2_, p_196271_3_, p_196271_4_, p_196271_5_, p_196271_6_);
}
protected void func_206840_a(StateContainer.Builder<Block, IBlockState> p_206840_1_) {
@@ -90,4 +87,16 @@
public BlockFaceShape func_193383_a(IBlockReader p_193383_1_, IBlockState p_193383_2_, BlockPos p_193383_3_, EnumFacing p_193383_4_) {
return p_193383_4_ != EnumFacing.UP && p_193383_4_ != EnumFacing.DOWN ? BlockFaceShape.MIDDLE_POLE : BlockFaceShape.CENTER;
}
+
+ @Override
+ public boolean canBeConnectedTo(IBlockState state, IBlockReader world, BlockPos pos, EnumFacing facing) {
+ IBlockState other = world.func_180495_p(pos.func_177972_a(facing));
+ return func_196416_a(other, other.func_193401_d(world, pos.func_177972_a(facing), facing.func_176734_d()));
+ }
+
+ private boolean canFenceConnectTo(IBlockReader world, BlockPos pos, EnumFacing facing) {
+ BlockPos offset = pos.func_177972_a(facing);
+ IBlockState other = world.func_180495_p(offset);
+ return other.canBeConnectedTo(world, offset, facing.func_176734_d()) || func_176223_P().canBeConnectedTo(world, pos, facing);
+ }
}
@@ -0,0 +1,26 @@
--- a/net/minecraft/block/BlockFenceGate.java
+++ b/net/minecraft/block/BlockFenceGate.java
@@ -100,7 +100,7 @@
}
private boolean func_196380_i(IBlockState p_196380_1_) {
- return p_196380_1_.func_177230_c() == Blocks.field_150463_bK || p_196380_1_.func_177230_c() == Blocks.field_196723_eg;
+ return p_196380_1_.func_177230_c() == Blocks.field_150463_bK || p_196380_1_.func_177230_c() == Blocks.field_196723_eg || p_196380_1_.func_177230_c() instanceof BlockWall;
}
public boolean func_196250_a(IBlockState p_196250_1_, World p_196250_2_, BlockPos p_196250_3_, EntityPlayer p_196250_4_, EnumHand p_196250_5_, EnumFacing p_196250_6_, float p_196250_7_, float p_196250_8_, float p_196250_9_) {
@@ -145,4 +145,14 @@
return BlockFaceShape.UNDEFINED;
}
}
+
+ @Override
+ public boolean canBeConnectedTo(IBlockState state, IBlockReader world, BlockPos pos, EnumFacing facing) {
+ if (state.func_193401_d(world, pos, facing) == BlockFaceShape.MIDDLE_POLE) {
+ Block other = world.func_180495_p(pos.func_177972_a(facing)).func_177230_c();
+ return other instanceof BlockFence || other instanceof BlockWall;
+ }
+ return false;
+ }
+
}
@@ -0,0 +1,188 @@
--- a/net/minecraft/block/BlockFire.java
+++ b/net/minecraft/block/BlockFire.java
@@ -64,13 +64,13 @@
public IBlockState func_196448_a(IBlockReader p_196448_1_, BlockPos p_196448_2_) {
IBlockState iblockstate = p_196448_1_.func_180495_p(p_196448_2_.func_177977_b());
- if (!iblockstate.func_185896_q() && !this.func_196446_i(iblockstate)) {
+ if (!iblockstate.func_185896_q() && !this.canCatchFire(p_196448_1_, p_196448_2_, EnumFacing.UP)) {
IBlockState iblockstate1 = this.func_176223_P();
for(EnumFacing enumfacing : EnumFacing.values()) {
BooleanProperty booleanproperty = field_196449_B.get(enumfacing);
if (booleanproperty != null) {
- iblockstate1 = iblockstate1.func_206870_a(booleanproperty, Boolean.valueOf(this.func_196446_i(p_196448_1_.func_180495_p(p_196448_2_.func_177972_a(enumfacing)))));
+ iblockstate1 = iblockstate1.func_206870_a(booleanproperty, Boolean.valueOf(this.canCatchFire(p_196448_1_, p_196448_2_.func_177972_a(enumfacing), enumfacing.func_176734_d())));
}
}
@@ -98,12 +98,13 @@
public void func_196267_b(IBlockState p_196267_1_, World p_196267_2_, BlockPos p_196267_3_, Random p_196267_4_) {
if (p_196267_2_.func_82736_K().func_82766_b("doFireTick")) {
+ if (!p_196267_2_.func_205050_e(p_196267_3_, 2)) return; // Forge: prevent loading unloaded chunks when spreading fire
if (!p_196267_1_.func_196955_c(p_196267_2_, p_196267_3_)) {
p_196267_2_.func_175698_g(p_196267_3_);
}
- Block block = p_196267_2_.func_180495_p(p_196267_3_.func_177977_b()).func_177230_c();
- boolean flag = p_196267_2_.field_73011_w instanceof EndDimension && block == Blocks.field_150357_h || block == Blocks.field_150424_aL || block == Blocks.field_196814_hQ;
+ IBlockState other = p_196267_2_.func_180495_p(p_196267_3_.func_177977_b());
+ boolean flag = other.isFireSource(p_196267_2_, p_196267_3_.func_177977_b(), EnumFacing.UP);
int i = p_196267_1_.func_177229_b(field_176543_a);
if (!flag && p_196267_2_.func_72896_J() && this.func_176537_d(p_196267_2_, p_196267_3_) && p_196267_4_.nextFloat() < 0.2F + (float)i * 0.03F) {
p_196267_2_.func_175698_g(p_196267_3_);
@@ -117,14 +118,14 @@
if (!flag) {
p_196267_2_.func_205220_G_().func_205360_a(p_196267_3_, this, this.func_149738_a(p_196267_2_) + p_196267_4_.nextInt(10));
if (!this.func_196447_a(p_196267_2_, p_196267_3_)) {
- if (!p_196267_2_.func_180495_p(p_196267_3_.func_177977_b()).func_185896_q() || i > 3) {
+ if (p_196267_2_.func_180495_p(p_196267_3_.func_177977_b()).func_193401_d(p_196267_2_, p_196267_3_.func_177977_b(), EnumFacing.UP) != BlockFaceShape.SOLID || i > 3) {
p_196267_2_.func_175698_g(p_196267_3_);
}
return;
}
- if (i == 15 && p_196267_4_.nextInt(4) == 0 && !this.func_196446_i(p_196267_2_.func_180495_p(p_196267_3_.func_177977_b()))) {
+ if (i == 15 && p_196267_4_.nextInt(4) == 0 && !this.canCatchFire(p_196267_2_, p_196267_3_.func_177977_b(), EnumFacing.UP)) {
p_196267_2_.func_175698_g(p_196267_3_);
return;
}
@@ -132,12 +133,12 @@
boolean flag1 = p_196267_2_.func_180502_D(p_196267_3_);
int k = flag1 ? -50 : 0;
- this.func_176536_a(p_196267_2_, p_196267_3_.func_177974_f(), 300 + k, p_196267_4_, i);
- this.func_176536_a(p_196267_2_, p_196267_3_.func_177976_e(), 300 + k, p_196267_4_, i);
- this.func_176536_a(p_196267_2_, p_196267_3_.func_177977_b(), 250 + k, p_196267_4_, i);
- this.func_176536_a(p_196267_2_, p_196267_3_.func_177984_a(), 250 + k, p_196267_4_, i);
- this.func_176536_a(p_196267_2_, p_196267_3_.func_177978_c(), 300 + k, p_196267_4_, i);
- this.func_176536_a(p_196267_2_, p_196267_3_.func_177968_d(), 300 + k, p_196267_4_, i);
+ this.tryCatchFire(p_196267_2_, p_196267_3_.func_177974_f(), 300 + k, p_196267_4_, i, EnumFacing.WEST);
+ this.tryCatchFire(p_196267_2_, p_196267_3_.func_177976_e(), 300 + k, p_196267_4_, i, EnumFacing.EAST);
+ this.tryCatchFire(p_196267_2_, p_196267_3_.func_177977_b(), 250 + k, p_196267_4_, i, EnumFacing.UP);
+ this.tryCatchFire(p_196267_2_, p_196267_3_.func_177984_a(), 250 + k, p_196267_4_, i, EnumFacing.DOWN);
+ this.tryCatchFire(p_196267_2_, p_196267_3_.func_177978_c(), 300 + k, p_196267_4_, i, EnumFacing.SOUTH);
+ this.tryCatchFire(p_196267_2_, p_196267_3_.func_177968_d(), 300 + k, p_196267_4_, i, EnumFacing.NORTH);
BlockPos.MutableBlockPos blockpos$mutableblockpos = new BlockPos.MutableBlockPos();
for(int l = -1; l <= 1; ++l) {
@@ -175,16 +176,18 @@
return p_176537_1_.func_175727_C(p_176537_2_) || p_176537_1_.func_175727_C(p_176537_2_.func_177976_e()) || p_176537_1_.func_175727_C(p_176537_2_.func_177974_f()) || p_176537_1_.func_175727_C(p_176537_2_.func_177978_c()) || p_176537_1_.func_175727_C(p_176537_2_.func_177968_d());
}
+ @Deprecated //Forge: Use IForgeBlockState.getFlammability
public int func_176532_c(Block p_176532_1_) {
return this.field_149848_b.getInt(p_176532_1_);
}
+ @Deprecated //Forge: Use IForgeBlockState.getFireSpreadSpeed
public int func_176534_d(Block p_176534_1_) {
return this.field_149849_a.getInt(p_176534_1_);
}
- private void func_176536_a(World p_176536_1_, BlockPos p_176536_2_, int p_176536_3_, Random p_176536_4_, int p_176536_5_) {
- int i = this.func_176532_c(p_176536_1_.func_180495_p(p_176536_2_).func_177230_c());
+ private void tryCatchFire(World p_176536_1_, BlockPos p_176536_2_, int p_176536_3_, Random p_176536_4_, int p_176536_5_, EnumFacing face) {
+ int i = p_176536_1_.func_180495_p(p_176536_2_).getFlammability(p_176536_1_, p_176536_2_, face);
if (p_176536_4_.nextInt(p_176536_3_) < i) {
IBlockState iblockstate = p_176536_1_.func_180495_p(p_176536_2_);
if (p_176536_4_.nextInt(p_176536_5_ + 10) < 5 && !p_176536_1_.func_175727_C(p_176536_2_)) {
@@ -204,7 +207,7 @@
private boolean func_196447_a(IBlockReader p_196447_1_, BlockPos p_196447_2_) {
for(EnumFacing enumfacing : EnumFacing.values()) {
- if (this.func_196446_i(p_196447_1_.func_180495_p(p_196447_2_.func_177972_a(enumfacing)))) {
+ if (this.canCatchFire(p_196447_1_, p_196447_2_.func_177972_a(enumfacing), enumfacing.func_176734_d())) {
return true;
}
}
@@ -219,7 +222,7 @@
int i = 0;
for(EnumFacing enumfacing : EnumFacing.values()) {
- i = Math.max(this.func_176534_d(p_176538_1_.func_180495_p(p_176538_2_.func_177972_a(enumfacing)).func_177230_c()), i);
+ i = Math.max(p_176538_1_.func_180495_p(p_176538_2_.func_177972_a(enumfacing)).getFlammability(p_176538_1_, p_176538_2_.func_177972_a(enumfacing), enumfacing.func_176734_d()), i);
}
return i;
@@ -230,6 +233,7 @@
return false;
}
+ @Deprecated //Forge: Use canCatchFire with more context
public boolean func_196446_i(IBlockState p_196446_1_) {
return this.func_176534_d(p_196446_1_.func_177230_c()) > 0;
}
@@ -252,8 +256,8 @@
p_180655_2_.func_184134_a((double)((float)p_180655_3_.func_177958_n() + 0.5F), (double)((float)p_180655_3_.func_177956_o() + 0.5F), (double)((float)p_180655_3_.func_177952_p() + 0.5F), SoundEvents.field_187643_bs, SoundCategory.BLOCKS, 1.0F + p_180655_4_.nextFloat(), p_180655_4_.nextFloat() * 0.7F + 0.3F, false);
}
- if (!p_180655_2_.func_180495_p(p_180655_3_.func_177977_b()).func_185896_q() && !this.func_196446_i(p_180655_2_.func_180495_p(p_180655_3_.func_177977_b()))) {
- if (this.func_196446_i(p_180655_2_.func_180495_p(p_180655_3_.func_177976_e()))) {
+ if (p_180655_2_.func_180495_p(p_180655_3_.func_177977_b()).func_193401_d(p_180655_2_, p_180655_3_.func_177977_b(), EnumFacing.UP) != BlockFaceShape.SOLID && !this.canCatchFire(p_180655_2_, p_180655_3_.func_177977_b(), EnumFacing.UP)) {
+ if (this.canCatchFire(p_180655_2_, p_180655_3_.func_177976_e(), EnumFacing.EAST)) {
for(int j = 0; j < 2; ++j) {
double d3 = (double)p_180655_3_.func_177958_n() + p_180655_4_.nextDouble() * (double)0.1F;
double d8 = (double)p_180655_3_.func_177956_o() + p_180655_4_.nextDouble();
@@ -262,7 +266,7 @@
}
}
- if (this.func_196446_i(p_180655_2_.func_180495_p(p_180655_3_.func_177974_f()))) {
+ if (this.canCatchFire(p_180655_2_, p_180655_3_.func_177974_f(), EnumFacing.WEST)) {
for(int k = 0; k < 2; ++k) {
double d4 = (double)(p_180655_3_.func_177958_n() + 1) - p_180655_4_.nextDouble() * (double)0.1F;
double d9 = (double)p_180655_3_.func_177956_o() + p_180655_4_.nextDouble();
@@ -271,7 +275,7 @@
}
}
- if (this.func_196446_i(p_180655_2_.func_180495_p(p_180655_3_.func_177978_c()))) {
+ if (this.canCatchFire(p_180655_2_, p_180655_3_.func_177978_c(), EnumFacing.SOUTH)) {
for(int l = 0; l < 2; ++l) {
double d5 = (double)p_180655_3_.func_177958_n() + p_180655_4_.nextDouble();
double d10 = (double)p_180655_3_.func_177956_o() + p_180655_4_.nextDouble();
@@ -280,7 +284,7 @@
}
}
- if (this.func_196446_i(p_180655_2_.func_180495_p(p_180655_3_.func_177968_d()))) {
+ if (this.canCatchFire(p_180655_2_, p_180655_3_.func_177968_d(), EnumFacing.NORTH)) {
for(int i1 = 0; i1 < 2; ++i1) {
double d6 = (double)p_180655_3_.func_177958_n() + p_180655_4_.nextDouble();
double d11 = (double)p_180655_3_.func_177956_o() + p_180655_4_.nextDouble();
@@ -289,7 +293,7 @@
}
}
- if (this.func_196446_i(p_180655_2_.func_180495_p(p_180655_3_.func_177984_a()))) {
+ if (this.canCatchFire(p_180655_2_, p_180655_3_.func_177984_a(), EnumFacing.DOWN)) {
for(int j1 = 0; j1 < 2; ++j1) {
double d7 = (double)p_180655_3_.func_177958_n() + p_180655_4_.nextDouble();
double d12 = (double)(p_180655_3_.func_177956_o() + 1) - p_180655_4_.nextDouble() * (double)0.1F;
@@ -321,10 +325,23 @@
}
public void func_180686_a(Block p_180686_1_, int p_180686_2_, int p_180686_3_) {
+ if (p_180686_1_ == Blocks.field_150350_a) throw new IllegalArgumentException("Tried to set air on fire... This is bad.");
this.field_149849_a.put(p_180686_1_, p_180686_2_);
this.field_149848_b.put(p_180686_1_, p_180686_3_);
}
+ /**
+ * Side sensitive version that calls the block function.
+ *
+ * @param world The current world
+ * @param pos Block position
+ * @param face The side the fire is coming from
+ * @return True if the face can catch fire.
+ */
+ public boolean canCatchFire(IBlockReader world, BlockPos pos, EnumFacing face) {
+ return world.func_180495_p(pos).isFlammable(world, pos, face);
+ }
+
public static void func_149843_e() {
BlockFire blockfire = (BlockFire)Blocks.field_150480_ab;
blockfire.func_180686_a(Blocks.field_196662_n, 5, 20);
@@ -0,0 +1,11 @@
--- a/net/minecraft/block/BlockFlowerPot.java
+++ b/net/minecraft/block/BlockFlowerPot.java
@@ -22,7 +22,7 @@
import net.minecraft.world.World;
public class BlockFlowerPot extends Block {
- private static final Map<Block, Block> field_196451_b = Maps.newHashMap();
+ private static final Map<Block, Block> field_196451_b = Maps.newHashMap(); //TODO: Delegates
protected static final VoxelShape field_196450_a = Block.func_208617_a(5.0D, 0.0D, 5.0D, 11.0D, 6.0D, 11.0D);
private final Block field_196452_c;
@@ -0,0 +1,25 @@
--- a/net/minecraft/block/BlockIce.java
+++ b/net/minecraft/block/BlockIce.java
@@ -34,8 +34,10 @@
public void func_180657_a(World p_180657_1_, EntityPlayer p_180657_2_, BlockPos p_180657_3_, IBlockState p_180657_4_, @Nullable TileEntity p_180657_5_, ItemStack p_180657_6_) {
p_180657_2_.func_71029_a(StatList.field_188065_ae.func_199076_b(this));
p_180657_2_.func_71020_j(0.005F);
- if (this.func_149700_E() && EnchantmentHelper.func_77506_a(Enchantments.field_185306_r, p_180657_6_) > 0) {
- func_180635_a(p_180657_1_, p_180657_3_, this.func_180643_i(p_180657_4_));
+ if (this.canSilkHarvest(p_180657_4_, p_180657_1_, p_180657_3_, p_180657_2_) && EnchantmentHelper.func_77506_a(Enchantments.field_185306_r, p_180657_6_) > 0) {
+ net.minecraft.util.NonNullList<ItemStack> items = net.minecraft.util.NonNullList.func_193580_a(ItemStack.field_190927_a, func_180643_i(p_180657_4_));
+ net.minecraftforge.event.ForgeEventFactory.fireBlockHarvesting(items, p_180657_1_, p_180657_3_, p_180657_4_, 0, 1.0f, true, p_180657_2_);
+ items.stream().filter(e -> !e.func_190926_b()).forEach(e -> func_180635_a(p_180657_1_, p_180657_3_, e));
} else {
if (p_180657_1_.field_73011_w.func_177500_n()) {
p_180657_1_.func_175698_g(p_180657_3_);
@@ -43,7 +45,9 @@
}
int i = EnchantmentHelper.func_77506_a(Enchantments.field_185308_t, p_180657_6_);
+ harvesters.set(p_180657_2_);
p_180657_4_.func_196949_c(p_180657_1_, p_180657_3_, i);
+ harvesters.set(null);
Material material = p_180657_1_.func_180495_p(p_180657_3_.func_177977_b()).func_185904_a();
if (material.func_76230_c() || material.func_76224_d()) {
p_180657_1_.func_175656_a(p_180657_3_, Blocks.field_150355_j.func_176223_P());
@@ -0,0 +1,12 @@
--- a/net/minecraft/block/BlockLadder.java
+++ b/net/minecraft/block/BlockLadder.java
@@ -151,4 +151,9 @@
return false;
}
}
+
+ @Override
+ public boolean isLadder(IBlockState state, net.minecraft.world.IWorldReader world, BlockPos pos, net.minecraft.entity.EntityLivingBase entity) {
+ return true;
+ }
}
@@ -0,0 +1,83 @@
--- a/net/minecraft/block/BlockLeaves.java
+++ b/net/minecraft/block/BlockLeaves.java
@@ -26,7 +26,7 @@
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
-public class BlockLeaves extends Block {
+public class BlockLeaves extends Block implements net.minecraftforge.common.IShearable {
public static final IntegerProperty field_208494_a = BlockStateProperties.field_208514_aa;
public static final BooleanProperty field_208495_b = BlockStateProperties.field_208515_s;
protected static boolean field_196478_c;
@@ -122,28 +122,37 @@
}
public void func_196255_a(IBlockState p_196255_1_, World p_196255_2_, BlockPos p_196255_3_, float p_196255_4_, int p_196255_5_) {
- if (!p_196255_2_.field_72995_K) {
- int i = this.func_196472_i(p_196255_1_);
- if (p_196255_5_ > 0) {
- i -= 2 << p_196255_5_;
+ super.func_196255_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_4_, p_196255_5_);
+ }
+
+ @Override
+ public void getDrops(IBlockState state, net.minecraft.util.NonNullList<ItemStack> drops, World worldIn, BlockPos pos, int fortune) {
+ {
+ int i = this.func_196472_i(state);
+ if (fortune > 0) {
+ i -= 2 << fortune;
if (i < 10) {
i = 10;
}
}
- if (p_196255_2_.field_73012_v.nextInt(i) == 0) {
- func_180635_a(p_196255_2_, p_196255_3_, new ItemStack(this.func_199769_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_5_)));
+ if (worldIn.field_73012_v.nextInt(i) == 0) {
+ ItemStack drop = new ItemStack(this.func_199769_a(state, worldIn, pos, fortune));
+ if (!drop.func_190926_b())
+ drops.add(drop);
}
i = 200;
- if (p_196255_5_ > 0) {
- i -= 10 << p_196255_5_;
+ if (fortune > 0) {
+ i -= 10 << fortune;
if (i < 40) {
i = 40;
}
}
- this.func_196474_a(p_196255_2_, p_196255_3_, p_196255_1_, i);
+ captureDrops(true);
+ this.func_196474_a(worldIn, pos, state, i);
+ drops.addAll(captureDrops(false));
}
}
@@ -173,13 +182,7 @@
}
public void func_180657_a(World p_180657_1_, EntityPlayer p_180657_2_, BlockPos p_180657_3_, IBlockState p_180657_4_, @Nullable TileEntity p_180657_5_, ItemStack p_180657_6_) {
- if (!p_180657_1_.field_72995_K && p_180657_6_.func_77973_b() == Items.field_151097_aZ) {
- p_180657_2_.func_71029_a(StatList.field_188065_ae.func_199076_b(this));
- p_180657_2_.func_71020_j(0.005F);
- func_180635_a(p_180657_1_, p_180657_3_, new ItemStack(this));
- } else {
super.func_180657_a(p_180657_1_, p_180657_2_, p_180657_3_, p_180657_4_, p_180657_5_, p_180657_6_);
- }
}
protected void func_206840_a(StateContainer.Builder<Block, IBlockState> p_206840_1_) {
@@ -189,4 +192,10 @@
public IBlockState func_196258_a(BlockItemUseContext p_196258_1_) {
return func_208493_b(this.func_176223_P().func_206870_a(field_208495_b, Boolean.valueOf(true)), p_196258_1_.func_195991_k(), p_196258_1_.func_195995_a());
}
+
+ @Override
+ public java.util.List<ItemStack> onSheared(@javax.annotation.Nonnull ItemStack item, net.minecraft.world.IWorld world, BlockPos pos, int fortune) {
+ world.func_180501_a(pos, Blocks.field_150350_a.func_176223_P(), 11);
+ return java.util.Arrays.asList(new ItemStack(this));
+ }
}
@@ -0,0 +1,27 @@
--- a/net/minecraft/block/BlockMobSpawner.java
+++ b/net/minecraft/block/BlockMobSpawner.java
@@ -13,6 +13,8 @@
import net.minecraft.world.World;
public class BlockMobSpawner extends BlockContainer {
+ private static final java.util.Random RAND = new java.util.Random();
+
protected BlockMobSpawner(Block.Properties p_i48364_1_) {
super(p_i48364_1_);
}
@@ -27,10 +29,13 @@
public void func_196255_a(IBlockState p_196255_1_, World p_196255_2_, BlockPos p_196255_3_, float p_196255_4_, int p_196255_5_) {
super.func_196255_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_4_, p_196255_5_);
- int i = 15 + p_196255_2_.field_73012_v.nextInt(15) + p_196255_2_.field_73012_v.nextInt(15);
- this.func_180637_b(p_196255_2_, p_196255_3_, i);
}
+ @Override
+ public int getExpDrop(IBlockState state, net.minecraft.world.IWorldReader world, BlockPos pos, int fortune) {
+ return 15 + RAND.nextInt(15) + RAND.nextInt(15);
+ }
+
public EnumBlockRenderType func_149645_b(IBlockState p_149645_1_) {
return EnumBlockRenderType.MODEL;
}
@@ -0,0 +1,11 @@
--- a/net/minecraft/block/BlockMushroom.java
+++ b/net/minecraft/block/BlockMushroom.java
@@ -64,7 +64,7 @@
IBlockState iblockstate = p_196260_2_.func_180495_p(blockpos);
Block block = iblockstate.func_177230_c();
if (block != Blocks.field_150391_bh && block != Blocks.field_196661_l) {
- return p_196260_2_.func_201669_a(p_196260_3_, 0) < 13 && this.func_200014_a_(iblockstate, p_196260_2_, blockpos);
+ return p_196260_2_.func_201669_a(p_196260_3_, 0) < 13 && iblockstate.canSustainPlant(p_196260_2_, blockpos, net.minecraft.util.EnumFacing.UP, this);
} else {
return true;
}
@@ -0,0 +1,36 @@
--- a/net/minecraft/block/BlockNetherWart.java
+++ b/net/minecraft/block/BlockNetherWart.java
@@ -33,16 +33,22 @@
public void func_196267_b(IBlockState p_196267_1_, World p_196267_2_, BlockPos p_196267_3_, Random p_196267_4_) {
int i = p_196267_1_.func_177229_b(field_176486_a);
- if (i < 3 && p_196267_4_.nextInt(10) == 0) {
+ if (i < 3 && net.minecraftforge.common.ForgeHooks.onCropsGrowPre(p_196267_2_, p_196267_3_, p_196267_1_, p_196267_4_.nextInt(10) == 0)) {
p_196267_1_ = p_196267_1_.func_206870_a(field_176486_a, Integer.valueOf(i + 1));
p_196267_2_.func_180501_a(p_196267_3_, p_196267_1_, 2);
+ net.minecraftforge.common.ForgeHooks.onCropsGrowPost(p_196267_2_, p_196267_3_, p_196267_1_);
}
super.func_196267_b(p_196267_1_, p_196267_2_, p_196267_3_, p_196267_4_);
}
public void func_196255_a(IBlockState p_196255_1_, World p_196255_2_, BlockPos p_196255_3_, float p_196255_4_, int p_196255_5_) {
- if (!p_196255_2_.field_72995_K) {
+ super.func_196255_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_4_, p_196255_5_);
+ }
+
+ @Override
+ public void getDrops(IBlockState p_196255_1_, net.minecraft.util.NonNullList<ItemStack> drops, World p_196255_2_, BlockPos p_196255_3_, int p_196255_5_) {
+ {
int i = 1;
if (p_196255_1_.func_177229_b(field_176486_a) >= 3) {
i = 2 + p_196255_2_.field_73012_v.nextInt(3);
@@ -52,7 +58,7 @@
}
for(int j = 0; j < i; ++j) {
- func_180635_a(p_196255_2_, p_196255_3_, new ItemStack(Items.field_151075_bm));
+ drops.add(new ItemStack(Items.field_151075_bm));
}
}
@@ -0,0 +1,32 @@
--- a/net/minecraft/block/BlockNote.java
+++ b/net/minecraft/block/BlockNote.java
@@ -49,7 +49,7 @@
}
private void func_196482_a(World p_196482_1_, BlockPos p_196482_2_) {
- if (p_196482_1_.func_180495_p(p_196482_2_.func_177984_a()).func_196958_f()) {
+ if (p_196482_1_.func_175623_d(p_196482_2_.func_177984_a())) {
p_196482_1_.func_175641_c(p_196482_2_, this, 0, 0);
}
@@ -59,7 +59,9 @@
if (p_196250_2_.field_72995_K) {
return true;
} else {
- p_196250_1_ = p_196250_1_.func_177231_a(field_196485_c);
+ int _new = net.minecraftforge.common.ForgeHooks.onNoteChange(p_196250_2_, p_196250_3_, p_196250_1_, p_196250_1_.func_177229_b(field_196485_c), p_196250_1_.func_177231_a(field_196485_c).func_177229_b(field_196485_c));
+ if (_new == -1) return false;
+ p_196250_1_ = (IBlockState)p_196250_1_.func_206870_a(field_196485_c, _new);
p_196250_2_.func_180501_a(p_196250_3_, p_196250_1_, 3);
this.func_196482_a(p_196250_2_, p_196250_3_);
p_196250_4_.func_195066_a(StatList.field_188087_U);
@@ -75,6 +77,9 @@
}
public boolean func_189539_a(IBlockState p_189539_1_, World p_189539_2_, BlockPos p_189539_3_, int p_189539_4_, int p_189539_5_) {
+ net.minecraftforge.event.world.NoteBlockEvent.Play e = new net.minecraftforge.event.world.NoteBlockEvent.Play(p_189539_2_, p_189539_3_, p_189539_1_, p_189539_1_.func_177229_b(field_196485_c), p_189539_1_.func_177229_b(field_196483_a));
+ if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(e)) return false;
+ p_189539_1_ = p_189539_1_.func_206870_a(field_196485_c, e.getVanillaNoteId()).func_206870_a(field_196483_a, e.getInstrument());
int i = p_189539_1_.func_177229_b(field_196485_c);
float f = (float)Math.pow(2.0D, (double)(i - 12) / 12.0D);
p_189539_2_.func_184133_a((EntityPlayer)null, p_189539_3_, p_189539_1_.func_177229_b(field_196483_a).func_208088_a(), SoundCategory.RECORDS, 3.0F, f);
@@ -0,0 +1,39 @@
--- a/net/minecraft/block/BlockOre.java
+++ b/net/minecraft/block/BlockOre.java
@@ -49,23 +49,27 @@
public void func_196255_a(IBlockState p_196255_1_, World p_196255_2_, BlockPos p_196255_3_, float p_196255_4_, int p_196255_5_) {
super.func_196255_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_4_, p_196255_5_);
- if (this.func_199769_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_5_) != this) {
+ }
+
+ @Override
+ public int getExpDrop(IBlockState state, net.minecraft.world.IWorldReader reader, BlockPos pos, int fortune) {
+ World world = reader instanceof World ? (World)reader : null;
+ if (world == null || this.func_199769_a(state, world, pos, fortune) != this) {
int i = 0;
if (this == Blocks.field_150365_q) {
- i = MathHelper.func_76136_a(p_196255_2_.field_73012_v, 0, 2);
+ i = MathHelper.func_76136_a(RANDOM, 0, 2);
} else if (this == Blocks.field_150482_ag) {
- i = MathHelper.func_76136_a(p_196255_2_.field_73012_v, 3, 7);
+ i = MathHelper.func_76136_a(RANDOM, 3, 7);
} else if (this == Blocks.field_150412_bA) {
- i = MathHelper.func_76136_a(p_196255_2_.field_73012_v, 3, 7);
+ i = MathHelper.func_76136_a(RANDOM, 3, 7);
} else if (this == Blocks.field_150369_x) {
- i = MathHelper.func_76136_a(p_196255_2_.field_73012_v, 2, 5);
+ i = MathHelper.func_76136_a(RANDOM, 2, 5);
} else if (this == Blocks.field_196766_fg) {
- i = MathHelper.func_76136_a(p_196255_2_.field_73012_v, 2, 5);
+ i = MathHelper.func_76136_a(RANDOM, 2, 5);
}
-
- this.func_180637_b(p_196255_2_, p_196255_3_, i);
+ return i;
}
-
+ return 0;
}
public ItemStack func_185473_a(IBlockReader p_185473_1_, BlockPos p_185473_2_, IBlockState p_185473_3_) {
@@ -0,0 +1,50 @@
--- a/net/minecraft/block/BlockPane.java
+++ b/net/minecraft/block/BlockPane.java
@@ -25,15 +25,12 @@
IBlockReader iblockreader = p_196258_1_.func_195991_k();
BlockPos blockpos = p_196258_1_.func_195995_a();
IFluidState ifluidstate = p_196258_1_.func_195991_k().func_204610_c(p_196258_1_.func_195995_a());
- BlockPos blockpos1 = blockpos.func_177978_c();
- BlockPos blockpos2 = blockpos.func_177968_d();
- BlockPos blockpos3 = blockpos.func_177976_e();
- BlockPos blockpos4 = blockpos.func_177974_f();
- IBlockState iblockstate = iblockreader.func_180495_p(blockpos1);
- IBlockState iblockstate1 = iblockreader.func_180495_p(blockpos2);
- IBlockState iblockstate2 = iblockreader.func_180495_p(blockpos3);
- IBlockState iblockstate3 = iblockreader.func_180495_p(blockpos4);
- return this.func_176223_P().func_206870_a(field_196409_a, Boolean.valueOf(this.func_196417_a(iblockstate, iblockstate.func_193401_d(iblockreader, blockpos1, EnumFacing.SOUTH)))).func_206870_a(field_196413_c, Boolean.valueOf(this.func_196417_a(iblockstate1, iblockstate1.func_193401_d(iblockreader, blockpos2, EnumFacing.NORTH)))).func_206870_a(field_196414_y, Boolean.valueOf(this.func_196417_a(iblockstate2, iblockstate2.func_193401_d(iblockreader, blockpos3, EnumFacing.EAST)))).func_206870_a(field_196411_b, Boolean.valueOf(this.func_196417_a(iblockstate3, iblockstate3.func_193401_d(iblockreader, blockpos4, EnumFacing.WEST)))).func_206870_a(field_204514_u, Boolean.valueOf(ifluidstate.func_206886_c() == Fluids.field_204546_a));
+ return this.func_176223_P()
+ .func_206870_a(field_196409_a, canPaneConnectTo(iblockreader, blockpos, EnumFacing.NORTH))
+ .func_206870_a(field_196413_c, canPaneConnectTo(iblockreader, blockpos, EnumFacing.SOUTH))
+ .func_206870_a(field_196414_y, canPaneConnectTo(iblockreader, blockpos, EnumFacing.WEST))
+ .func_206870_a(field_196411_b, canPaneConnectTo(iblockreader, blockpos, EnumFacing.EAST))
+ .func_206870_a(field_204514_u, Boolean.valueOf(ifluidstate.func_206886_c() == Fluids.field_204546_a));
}
public IBlockState func_196271_a(IBlockState p_196271_1_, EnumFacing p_196271_2_, IBlockState p_196271_3_, IWorld p_196271_4_, BlockPos p_196271_5_, BlockPos p_196271_6_) {
@@ -41,7 +38,7 @@
p_196271_4_.func_205219_F_().func_205360_a(p_196271_5_, Fluids.field_204546_a, Fluids.field_204546_a.func_205569_a(p_196271_4_));
}
- return p_196271_2_.func_176740_k().func_176722_c() ? p_196271_1_.func_206870_a(field_196415_z.get(p_196271_2_), Boolean.valueOf(this.func_196417_a(p_196271_3_, p_196271_3_.func_193401_d(p_196271_4_, p_196271_6_, p_196271_2_.func_176734_d())))) : super.func_196271_a(p_196271_1_, p_196271_2_, p_196271_3_, p_196271_4_, p_196271_5_, p_196271_6_);
+ return p_196271_2_.func_176740_k().func_176722_c() ? p_196271_1_.func_206870_a(field_196415_z.get(p_196271_2_), Boolean.valueOf(this.canPaneConnectTo(p_196271_4_, p_196271_5_, p_196271_2_))) : super.func_196271_a(p_196271_1_, p_196271_2_, p_196271_3_, p_196271_4_, p_196271_5_, p_196271_6_);
}
public boolean func_149686_d(IBlockState p_149686_1_) {
@@ -87,4 +84,16 @@
public BlockFaceShape func_193383_a(IBlockReader p_193383_1_, IBlockState p_193383_2_, BlockPos p_193383_3_, EnumFacing p_193383_4_) {
return p_193383_4_ != EnumFacing.UP && p_193383_4_ != EnumFacing.DOWN ? BlockFaceShape.MIDDLE_POLE_THIN : BlockFaceShape.CENTER_SMALL;
}
+
+ @Override
+ public boolean canBeConnectedTo(IBlockState state, IBlockReader world, BlockPos pos, EnumFacing facing) {
+ IBlockState other = world.func_180495_p(pos.func_177972_a(facing));
+ return func_196417_a(other, other.func_193401_d(world, pos.func_177972_a(facing), facing.func_176734_d()));
+ }
+
+ private boolean canPaneConnectTo(IBlockReader world, BlockPos pos, EnumFacing facing) {
+ BlockPos offset = pos.func_177972_a(facing);
+ IBlockState other = world.func_180495_p(offset);
+ return other.canBeConnectedTo(world, offset, facing.func_176734_d()) || func_176223_P().canBeConnectedTo(world, pos, facing);
+ }
}
@@ -0,0 +1,33 @@
--- a/net/minecraft/block/BlockPistonBase.java
+++ b/net/minecraft/block/BlockPistonBase.java
@@ -244,7 +244,7 @@
return false;
}
- return !block.func_149716_u();
+ return !p_185646_0_.hasTileEntity();
} else {
return false;
}
@@ -280,7 +280,9 @@
for(int j = list2.size() - 1; j >= 0; --j) {
BlockPos blockpos2 = list2.get(j);
IBlockState iblockstate = p_176319_1_.func_180495_p(blockpos2);
- iblockstate.func_196949_c(p_176319_1_, blockpos2, 0);
+ // Forge: With our change to how snowballs are dropped this needs to disallow to mimic vanilla behavior.
+ float chance = iblockstate.func_177230_c() instanceof BlockSnow ? -1.0f : 1.0f;
+ iblockstate.func_196941_a(p_176319_1_, blockpos2, chance, 0);
p_176319_1_.func_180501_a(blockpos2, Blocks.field_150350_a.func_176223_P(), 18);
--k;
aiblockstate[k] = iblockstate;
@@ -333,6 +335,10 @@
return p_185499_1_.func_206870_a(field_176387_N, p_185499_2_.func_185831_a(p_185499_1_.func_177229_b(field_176387_N)));
}
+ public IBlockState rotate(IBlockState state, net.minecraft.world.IWorld world, BlockPos pos, Rotation direction) {
+ return state.func_177229_b(field_176320_b) ? state : super.rotate(state, world, pos, direction);
+ }
+
public IBlockState func_185471_a(IBlockState p_185471_1_, Mirror p_185471_2_) {
return p_185471_1_.func_185907_a(p_185471_2_.func_185800_a(p_185471_1_.func_177229_b(field_176387_N)));
}
@@ -0,0 +1,26 @@
--- a/net/minecraft/block/BlockPistonMoving.java
+++ b/net/minecraft/block/BlockPistonMoving.java
@@ -86,14 +86,22 @@
}
public void func_196255_a(IBlockState p_196255_1_, World p_196255_2_, BlockPos p_196255_3_, float p_196255_4_, int p_196255_5_) {
- if (!p_196255_2_.field_72995_K) {
+ if (false && !p_196255_2_.field_72995_K) { //Forge: Noop this out
TileEntityPiston tileentitypiston = this.func_196342_a(p_196255_2_, p_196255_3_);
if (tileentitypiston != null) {
tileentitypiston.func_200230_i().func_196949_c(p_196255_2_, p_196255_3_, 0);
}
}
+ super.func_196255_a(p_196255_1_, p_196255_2_, p_196255_3_, 1, p_196255_5_); // mimic vanilla behavior from above and ignore chance
}
+ @Override
+ public void getDrops(IBlockState state, net.minecraft.util.NonNullList<ItemStack> drops, World world, BlockPos pos, int fortune) {
+ TileEntityPiston te = this.func_196342_a(world, pos);
+ if (te != null)
+ te.func_200230_i().getDrops(drops, world, pos, fortune);
+ }
+
public VoxelShape func_196244_b(IBlockState p_196244_1_, IBlockReader p_196244_2_, BlockPos p_196244_3_) {
return VoxelShapes.func_197880_a();
}
@@ -0,0 +1,11 @@
--- a/net/minecraft/block/BlockPortal.java
+++ b/net/minecraft/block/BlockPortal.java
@@ -76,7 +76,7 @@
public boolean func_176548_d(IWorld p_176548_1_, BlockPos p_176548_2_) {
BlockPortal.Size blockportal$size = this.func_201816_b(p_176548_1_, p_176548_2_);
- if (blockportal$size != null) {
+ if (blockportal$size != null && !net.minecraftforge.event.ForgeEventFactory.onTrySpawnPortal(p_176548_1_, p_176548_2_, blockportal$size)) {
blockportal$size.func_150859_c();
return true;
} else {
@@ -0,0 +1,25 @@
--- a/net/minecraft/block/BlockPotato.java
+++ b/net/minecraft/block/BlockPotato.java
@@ -26,7 +26,7 @@
public void func_196255_a(IBlockState p_196255_1_, World p_196255_2_, BlockPos p_196255_3_, float p_196255_4_, int p_196255_5_) {
super.func_196255_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_4_, p_196255_5_);
- if (!p_196255_2_.field_72995_K) {
+ if (false && !p_196255_2_.field_72995_K) { //Forge: Moved to getDrops
if (this.func_185525_y(p_196255_1_) && p_196255_2_.field_73012_v.nextInt(50) == 0) {
func_180635_a(p_196255_2_, p_196255_3_, new ItemStack(Items.field_151170_bI));
}
@@ -34,6 +34,13 @@
}
}
+ @Override
+ public void getDrops(IBlockState state, net.minecraft.util.NonNullList<ItemStack> drops, World world, BlockPos pos, int fortune) {
+ super.getDrops(state, drops, world, pos, fortune);
+ if (this.func_185525_y(state) && world.field_73012_v.nextInt(50) == 0)
+ drops.add(new ItemStack(Items.field_151170_bI));
+ }
+
public VoxelShape func_196244_b(IBlockState p_196244_1_, IBlockReader p_196244_2_, BlockPos p_196244_3_) {
return field_196396_a[p_196244_1_.func_177229_b(this.func_185524_e())];
}
@@ -0,0 +1,123 @@
--- a/net/minecraft/block/BlockRailBase.java
+++ b/net/minecraft/block/BlockRailBase.java
@@ -37,7 +37,7 @@
}
public VoxelShape func_196244_b(IBlockState p_196244_1_, IBlockReader p_196244_2_, BlockPos p_196244_3_) {
- RailShape railshape = p_196244_1_.func_177230_c() == this ? p_196244_1_.func_177229_b(this.func_176560_l()) : null;
+ RailShape railshape = p_196244_1_.func_177230_c() == this ? getRailDirection(p_196244_1_, p_196244_2_, p_196244_3_, null) : null;
return railshape != null && railshape.func_208092_c() ? field_190959_b : field_185590_a;
}
@@ -50,7 +50,8 @@
}
public boolean func_196260_a(IBlockState p_196260_1_, IWorldReaderBase p_196260_2_, BlockPos p_196260_3_) {
- return p_196260_2_.func_180495_p(p_196260_3_.func_177977_b()).func_185896_q();
+ IBlockState down = p_196260_2_.func_180495_p(p_196260_3_.func_177977_b());
+ return down.func_185896_q() || down.func_193401_d(p_196260_2_, p_196260_3_.func_177977_b(), EnumFacing.UP) == BlockFaceShape.SOLID;
}
public void func_196259_b(IBlockState p_196259_1_, World p_196259_2_, BlockPos p_196259_3_, IBlockState p_196259_4_) {
@@ -67,19 +68,19 @@
public void func_189540_a(IBlockState p_189540_1_, World p_189540_2_, BlockPos p_189540_3_, Block p_189540_4_, BlockPos p_189540_5_) {
if (!p_189540_2_.field_72995_K) {
- RailShape railshape = p_189540_1_.func_177229_b(this.func_176560_l());
+ RailShape railshape = getRailDirection(p_189540_1_, p_189540_2_, p_189540_3_, null);
boolean flag = false;
- if (!p_189540_2_.func_180495_p(p_189540_3_.func_177977_b()).func_185896_q()) {
+ if (!p_189540_1_.func_196955_c(p_189540_2_, p_189540_3_)) {
flag = true;
}
- if (railshape == RailShape.ASCENDING_EAST && !p_189540_2_.func_180495_p(p_189540_3_.func_177974_f()).func_185896_q()) {
+ if (railshape == RailShape.ASCENDING_EAST && !p_189540_1_.func_196955_c(p_189540_2_, p_189540_3_.func_177974_f().func_177984_a())) {
flag = true;
- } else if (railshape == RailShape.ASCENDING_WEST && !p_189540_2_.func_180495_p(p_189540_3_.func_177976_e()).func_185896_q()) {
+ } else if (railshape == RailShape.ASCENDING_WEST && !p_189540_1_.func_196955_c(p_189540_2_, p_189540_3_.func_177976_e().func_177984_a())) {
flag = true;
- } else if (railshape == RailShape.ASCENDING_NORTH && !p_189540_2_.func_180495_p(p_189540_3_.func_177978_c()).func_185896_q()) {
+ } else if (railshape == RailShape.ASCENDING_NORTH && !p_189540_1_.func_196955_c(p_189540_2_, p_189540_3_.func_177978_c().func_177984_a())) {
flag = true;
- } else if (railshape == RailShape.ASCENDING_SOUTH && !p_189540_2_.func_180495_p(p_189540_3_.func_177968_d()).func_185896_q()) {
+ } else if (railshape == RailShape.ASCENDING_SOUTH && !p_189540_1_.func_196955_c(p_189540_2_, p_189540_3_.func_177968_d().func_177984_a())) {
flag = true;
}
@@ -111,7 +112,7 @@
public void func_196243_a(IBlockState p_196243_1_, World p_196243_2_, BlockPos p_196243_3_, IBlockState p_196243_4_, boolean p_196243_5_) {
if (!p_196243_5_) {
super.func_196243_a(p_196243_1_, p_196243_2_, p_196243_3_, p_196243_4_, p_196243_5_);
- if (p_196243_1_.func_177229_b(this.func_176560_l()).func_208092_c()) {
+ if (getRailDirection(p_196243_1_, p_196243_2_, p_196243_3_, null).func_208092_c()) {
p_196243_2_.func_195593_d(p_196243_3_.func_177984_a(), this);
}
@@ -123,5 +124,66 @@
}
}
+ //Forge: Use getRailDirection(IBlockAccess, BlockPos, IBlockState, EntityMinecart) for enhanced ability
public abstract IProperty<RailShape> func_176560_l();
+
+ /* ======================================== FORGE START =====================================*/
+ /**
+ * Return true if the rail can make corners.
+ * Used by placement logic.
+ * @param world The world.
+ * @param pos Block's position in world
+ * @return True if the rail can make corners.
+ */
+ public boolean isFlexibleRail(IBlockState state, IBlockReader world, BlockPos pos)
+ {
+ return !this.field_196277_c;
+ }
+
+ /**
+ * Returns true if the rail can make up and down slopes.
+ * Used by placement logic.
+ * @param world The world.
+ * @param pos Block's position in world
+ * @return True if the rail can make slopes.
+ */
+ public boolean canMakeSlopes(IBlockState state, IBlockReader world, BlockPos pos) {
+ return true;
+ }
+
+ /**
+ * Return the rail's direction.
+ * Can be used to make the cart think the rail is a different shape,
+ * for example when making diamond junctions or switches.
+ * The cart parameter will often be null unless it it called from EntityMinecart.
+ *
+ * @param world The world.
+ * @param pos Block's position in world
+ * @param state The BlockState
+ * @param cart The cart asking for the metadata, null if it is not called by EntityMinecart.
+ * @return The direction.
+ */
+ public RailShape getRailDirection(IBlockState state, IBlockReader world, BlockPos pos, @javax.annotation.Nullable net.minecraft.entity.item.EntityMinecart cart) {
+ return state.func_177229_b(func_176560_l());
+ }
+
+ /**
+ * Returns the max speed of the rail at the specified position.
+ * @param world The world.
+ * @param cart The cart on the rail, may be null.
+ * @param pos Block's position in world
+ * @return The max speed of the current rail.
+ */
+ public float getRailMaxSpeed(IBlockState state, World world, BlockPos pos, net.minecraft.entity.item.EntityMinecart cart) {
+ return 0.4f;
+ }
+
+ /**
+ * This function is called by any minecart that passes over this rail.
+ * It is called once per update tick that the minecart is on the rail.
+ * @param world The world.
+ * @param cart The cart on the rail.
+ * @param pos Block's position in world
+ */
+ public void onMinecartPass(IBlockState state, World world, BlockPos pos, net.minecraft.entity.item.EntityMinecart cart) { }
}
@@ -0,0 +1,11 @@
--- a/net/minecraft/block/BlockRailDetector.java
+++ b/net/minecraft/block/BlockRailDetector.java
@@ -127,6 +127,8 @@
public int func_180641_l(IBlockState p_180641_1_, World p_180641_2_, BlockPos p_180641_3_) {
if (p_180641_1_.func_177229_b(field_176574_M)) {
+ List<EntityMinecart> carts = this.func_200878_a(p_180641_2_, p_180641_3_, EntityMinecart.class, null);
+ if (!carts.isEmpty() && carts.get(0).getComparatorLevel() > -1) return carts.get(0).getComparatorLevel();
List<EntityMinecartCommandBlock> list = this.func_200878_a(p_180641_2_, p_180641_3_, EntityMinecartCommandBlock.class, (Predicate<Entity>)null);
if (!list.isEmpty()) {
return list.get(0).func_145822_e().func_145760_g();
@@ -0,0 +1,29 @@
--- a/net/minecraft/block/BlockRailPowered.java
+++ b/net/minecraft/block/BlockRailPowered.java
@@ -15,10 +15,16 @@
public class BlockRailPowered extends BlockRailBase {
public static final EnumProperty<RailShape> field_176568_b = BlockStateProperties.field_208166_S;
public static final BooleanProperty field_176569_M = BlockStateProperties.field_208194_u;
+ private final boolean isActivator;
protected BlockRailPowered(Block.Properties p_i48349_1_) {
- super(true, p_i48349_1_);
+ this(p_i48349_1_, false);
+ }
+
+ protected BlockRailPowered(Block.Properties builder, boolean isActivator) {
+ super(true, builder);
this.func_180632_j(this.field_176227_L.func_177621_b().func_206870_a(field_176568_b, RailShape.NORTH_SOUTH).func_206870_a(field_176569_M, Boolean.valueOf(false)));
+ this.isActivator = isActivator;
}
protected boolean func_176566_a(World p_176566_1_, BlockPos p_176566_2_, IBlockState p_176566_3_, boolean p_176566_4_, int p_176566_5_) {
@@ -100,7 +106,7 @@
protected boolean func_208071_a(World p_208071_1_, BlockPos p_208071_2_, boolean p_208071_3_, int p_208071_4_, RailShape p_208071_5_) {
IBlockState iblockstate = p_208071_1_.func_180495_p(p_208071_2_);
- if (iblockstate.func_177230_c() != this) {
+ if (!(iblockstate.func_177230_c() instanceof BlockRailPowered) || isActivator != ((BlockRailPowered)iblockstate.func_177230_c()).isActivator) {
return false;
} else {
RailShape railshape = iblockstate.func_177229_b(field_176568_b);
@@ -0,0 +1,57 @@
--- a/net/minecraft/block/BlockRailState.java
+++ b/net/minecraft/block/BlockRailState.java
@@ -16,14 +16,16 @@
private IBlockState field_196923_d;
private final boolean field_208513_e;
private final List<BlockPos> field_196924_e = Lists.newArrayList();
+ private final boolean canMakeSlopes;
public BlockRailState(World p_i47755_1_, BlockPos p_i47755_2_, IBlockState p_i47755_3_) {
this.field_196920_a = p_i47755_1_;
this.field_196921_b = p_i47755_2_;
this.field_196923_d = p_i47755_3_;
this.field_196922_c = (BlockRailBase)p_i47755_3_.func_177230_c();
- RailShape railshape = p_i47755_3_.func_177229_b(this.field_196922_c.func_176560_l());
- this.field_208513_e = this.field_196922_c.func_208490_b();
+ RailShape railshape = this.field_196922_c.getRailDirection(field_196923_d, p_i47755_1_, p_i47755_2_, null);
+ this.field_208513_e = !this.field_196922_c.isFlexibleRail(field_196923_d, p_i47755_1_, p_i47755_2_);
+ this.canMakeSlopes = this.field_196922_c.canMakeSlopes(field_196923_d, p_i47755_1_, p_i47755_2_);
this.func_208509_a(railshape);
}
@@ -179,7 +181,7 @@
}
}
- if (railshape == RailShape.NORTH_SOUTH) {
+ if (railshape == RailShape.NORTH_SOUTH && canMakeSlopes) {
if (BlockRailBase.func_208488_a(this.field_196920_a, blockpos.func_177984_a())) {
railshape = RailShape.ASCENDING_NORTH;
}
@@ -189,7 +191,7 @@
}
}
- if (railshape == RailShape.EAST_WEST) {
+ if (railshape == RailShape.EAST_WEST && canMakeSlopes) {
if (BlockRailBase.func_208488_a(this.field_196920_a, blockpos3.func_177984_a())) {
railshape = RailShape.ASCENDING_EAST;
}
@@ -299,7 +301,7 @@
}
}
- if (railshape == RailShape.NORTH_SOUTH) {
+ if (railshape == RailShape.NORTH_SOUTH && canMakeSlopes) {
if (BlockRailBase.func_208488_a(this.field_196920_a, blockpos.func_177984_a())) {
railshape = RailShape.ASCENDING_NORTH;
}
@@ -309,7 +311,7 @@
}
}
- if (railshape == RailShape.EAST_WEST) {
+ if (railshape == RailShape.EAST_WEST && canMakeSlopes) {
if (BlockRailBase.func_208488_a(this.field_196920_a, blockpos3.func_177984_a())) {
railshape = RailShape.ASCENDING_EAST;
}
@@ -0,0 +1,19 @@
--- a/net/minecraft/block/BlockRedstoneComparator.java
+++ b/net/minecraft/block/BlockRedstoneComparator.java
@@ -156,4 +156,16 @@
protected void func_206840_a(StateContainer.Builder<Block, IBlockState> p_206840_1_) {
p_206840_1_.func_206894_a(field_185512_D, field_176463_b, field_196348_c);
}
+
+ @Override
+ public boolean getWeakChanges(IBlockState state, net.minecraft.world.IWorldReader world, BlockPos pos) {
+ return true;
+ }
+
+ @Override
+ public void onNeighborChange(IBlockState state, net.minecraft.world.IWorldReader world, BlockPos pos, BlockPos neighbor) {
+ if (pos.func_177956_o() == neighbor.func_177956_o() && world instanceof World && !((World)world).func_201670_d()) {
+ func_189540_a(state, (World)world, pos, world.func_180495_p(neighbor).func_177230_c(), neighbor);
+ }
+ }
}
@@ -0,0 +1,20 @@
--- a/net/minecraft/block/BlockRedstoneDiode.java
+++ b/net/minecraft/block/BlockRedstoneDiode.java
@@ -35,7 +35,7 @@
}
public boolean func_196260_a(IBlockState p_196260_1_, IWorldReaderBase p_196260_2_, BlockPos p_196260_3_) {
- return p_196260_2_.func_180495_p(p_196260_3_.func_177977_b()).func_185896_q();
+ return p_196260_2_.func_180495_p(p_196260_3_.func_177977_b()).func_185896_q() || p_196260_2_.func_180495_p(p_196260_3_.func_177977_b()).func_193401_d(p_196260_2_, p_196260_3_.func_177977_b(), EnumFacing.UP) == BlockFaceShape.SOLID;
}
public void func_196267_b(IBlockState p_196267_1_, World p_196267_2_, BlockPos p_196267_3_, Random p_196267_4_) {
@@ -172,6 +172,8 @@
protected void func_176400_h(World p_176400_1_, BlockPos p_176400_2_, IBlockState p_176400_3_) {
EnumFacing enumfacing = p_176400_3_.func_177229_b(field_185512_D);
BlockPos blockpos = p_176400_2_.func_177972_a(enumfacing.func_176734_d());
+ if (net.minecraftforge.event.ForgeEventFactory.onNeighborNotify(p_176400_1_, p_176400_2_, p_176400_1_.func_180495_p(p_176400_2_), java.util.EnumSet.of(enumfacing.func_176734_d()), false).isCanceled())
+ return;
p_176400_1_.func_190524_a(blockpos, this, p_176400_2_);
p_176400_1_.func_175695_a(blockpos, this, enumfacing);
}
@@ -0,0 +1,21 @@
--- a/net/minecraft/block/BlockRedstoneOre.java
+++ b/net/minecraft/block/BlockRedstoneOre.java
@@ -72,11 +72,17 @@
public void func_196255_a(IBlockState p_196255_1_, World p_196255_2_, BlockPos p_196255_3_, float p_196255_4_, int p_196255_5_) {
super.func_196255_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_4_, p_196255_5_);
- if (this.func_199769_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_5_) != this) {
+ if (false && this.func_199769_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_5_) != this) {
int i = 1 + p_196255_2_.field_73012_v.nextInt(5);
this.func_180637_b(p_196255_2_, p_196255_3_, i);
}
+ }
+ @Override
+ public int getExpDrop(IBlockState state, net.minecraft.world.IWorldReader world, BlockPos pos, int fortune) {
+ if (!(world instanceof World) || func_199769_a(state, (World)world, pos, fortune) != this)
+ return 1 + RANDOM.nextInt(5);
+ return 0;
}
@OnlyIn(Dist.CLIENT)
@@ -0,0 +1,11 @@
--- a/net/minecraft/block/BlockRedstoneTorch.java
+++ b/net/minecraft/block/BlockRedstoneTorch.java
@@ -24,7 +24,7 @@
public class BlockRedstoneTorch extends BlockTorch {
public static final BooleanProperty field_196528_a = BlockStateProperties.field_208190_q;
- private static final Map<IBlockReader, List<BlockRedstoneTorch.Toggle>> field_196529_b = Maps.newHashMap();
+ private static final Map<IBlockReader, List<BlockRedstoneTorch.Toggle>> field_196529_b = new java.util.WeakHashMap<IBlockReader, List<BlockRedstoneTorch.Toggle>>(); // FORGE - fix vanilla MC-101233
protected BlockRedstoneTorch(Block.Properties p_i48342_1_) {
super(p_i48342_1_);
@@ -0,0 +1,71 @@
--- a/net/minecraft/block/BlockRedstoneWire.java
+++ b/net/minecraft/block/BlockRedstoneWire.java
@@ -124,8 +124,8 @@
IBlockState iblockstate = p_208074_1_.func_180495_p(p_208074_2_.func_177972_a(p_208074_3_));
IBlockState iblockstate1 = p_208074_1_.func_180495_p(p_208074_2_.func_177984_a());
if (!iblockstate1.func_185915_l()) {
- boolean flag = p_208074_1_.func_180495_p(blockpos).func_185896_q() || p_208074_1_.func_180495_p(blockpos).func_177230_c() == Blocks.field_150426_aN;
- if (flag && func_176346_d(p_208074_1_.func_180495_p(blockpos.func_177984_a()))) {
+ boolean flag = iblockstate.func_193401_d(p_208074_1_, blockpos, EnumFacing.UP) == BlockFaceShape.SOLID || iblockstate.func_177230_c() == Blocks.field_150426_aN;
+ if (flag && canConnectTo(p_208074_1_.func_180495_p(blockpos.func_177984_a()), p_208074_1_, blockpos.func_177984_a(), null)) {
if (iblockstate.func_185898_k()) {
return RedstoneSide.UP;
}
@@ -134,7 +134,7 @@
}
}
- return !func_176343_a(p_208074_1_.func_180495_p(blockpos), p_208074_3_) && (iblockstate.func_185915_l() || !func_176346_d(p_208074_1_.func_180495_p(blockpos.func_177977_b()))) ? RedstoneSide.NONE : RedstoneSide.SIDE;
+ return !canConnectTo(p_208074_1_.func_180495_p(blockpos), p_208074_1_, blockpos, p_208074_3_) && (iblockstate.func_185915_l() || !canConnectTo(p_208074_1_.func_180495_p(blockpos.func_177977_b()), p_208074_1_, blockpos.func_177977_b(), null)) ? RedstoneSide.NONE : RedstoneSide.SIDE;
}
public boolean func_149686_d(IBlockState p_149686_1_) {
@@ -143,7 +143,7 @@
public boolean func_196260_a(IBlockState p_196260_1_, IWorldReaderBase p_196260_2_, BlockPos p_196260_3_) {
IBlockState iblockstate = p_196260_2_.func_180495_p(p_196260_3_.func_177977_b());
- return iblockstate.func_185896_q() || iblockstate.func_177230_c() == Blocks.field_150426_aN;
+ return iblockstate.func_185896_q() || iblockstate.func_177230_c() == Blocks.field_150426_aN || iblockstate.func_193401_d(p_196260_2_, p_196260_3_.func_177977_b(), EnumFacing.UP) == BlockFaceShape.SOLID;
}
private IBlockState func_176338_e(World p_176338_1_, BlockPos p_176338_2_, IBlockState p_176338_3_) {
@@ -338,26 +338,18 @@
IBlockState iblockstate = p_176339_1_.func_180495_p(blockpos);
boolean flag = iblockstate.func_185915_l();
boolean flag1 = p_176339_1_.func_180495_p(p_176339_2_.func_177984_a()).func_185915_l();
- if (!flag1 && flag && func_176340_e(p_176339_1_, blockpos.func_177984_a())) {
+ if (!flag1 && flag && canConnectTo(p_176339_1_.func_180495_p(blockpos.func_177984_a()), p_176339_1_, blockpos.func_177984_a(), null)) {
return true;
- } else if (func_176343_a(iblockstate, p_176339_3_)) {
+ } else if (canConnectTo(iblockstate, p_176339_1_, blockpos, p_176339_3_)) {
return true;
} else if (iblockstate.func_177230_c() == Blocks.field_196633_cV && iblockstate.func_177229_b(BlockRedstoneDiode.field_196348_c) && iblockstate.func_177229_b(BlockRedstoneDiode.field_185512_D) == p_176339_3_) {
return true;
} else {
- return !flag && func_176340_e(p_176339_1_, blockpos.func_177977_b());
+ return !flag && canConnectTo(p_176339_1_.func_180495_p(blockpos.func_177977_b()), p_176339_1_, blockpos.func_177977_b(), null);
}
}
- protected static boolean func_176340_e(IBlockReader p_176340_0_, BlockPos p_176340_1_) {
- return func_176346_d(p_176340_0_.func_180495_p(p_176340_1_));
- }
-
- protected static boolean func_176346_d(IBlockState p_176346_0_) {
- return func_176343_a(p_176346_0_, (EnumFacing)null);
- }
-
- protected static boolean func_176343_a(IBlockState p_176343_0_, @Nullable EnumFacing p_176343_1_) {
+ protected boolean canConnectTo(IBlockState p_176343_0_, IBlockReader world, BlockPos pos, @Nullable EnumFacing p_176343_1_) {
Block block = p_176343_0_.func_177230_c();
if (block == Blocks.field_150488_af) {
return true;
@@ -367,7 +359,7 @@
} else if (Blocks.field_190976_dk == p_176343_0_.func_177230_c()) {
return p_176343_1_ == p_176343_0_.func_177229_b(BlockObserver.field_176387_N);
} else {
- return p_176343_0_.func_185897_m() && p_176343_1_ != null;
+ return p_176343_0_.canConnectRedstone(world, pos, p_176343_1_) && p_176343_1_ != null;
}
}
@@ -0,0 +1,52 @@
--- a/net/minecraft/block/BlockReed.java
+++ b/net/minecraft/block/BlockReed.java
@@ -18,7 +18,7 @@
import net.minecraft.world.IWorldReaderBase;
import net.minecraft.world.World;
-public class BlockReed extends Block {
+public class BlockReed extends Block implements net.minecraftforge.common.IPlantable {
public static final IntegerProperty field_176355_a = BlockStateProperties.field_208171_X;
protected static final VoxelShape field_196503_b = Block.func_208617_a(2.0D, 0.0D, 2.0D, 14.0D, 16.0D, 14.0D);
@@ -40,12 +40,15 @@
if (i < 3) {
int j = p_196267_1_.func_177229_b(field_176355_a);
+ if (net.minecraftforge.common.ForgeHooks.onCropsGrowPre(p_196267_2_, p_196267_3_, p_196267_1_, true)) {
if (j == 15) {
p_196267_2_.func_175656_a(p_196267_3_.func_177984_a(), this.func_176223_P());
p_196267_2_.func_180501_a(p_196267_3_, p_196267_1_.func_206870_a(field_176355_a, Integer.valueOf(0)), 4);
} else {
p_196267_2_.func_180501_a(p_196267_3_, p_196267_1_.func_206870_a(field_176355_a, Integer.valueOf(j + 1)), 4);
}
+ net.minecraftforge.common.ForgeHooks.onCropsGrowPost(p_196267_2_, p_196267_3_, p_196267_1_);
+ }
}
}
@@ -56,6 +59,9 @@
}
public boolean func_196260_a(IBlockState p_196260_1_, IWorldReaderBase p_196260_2_, BlockPos p_196260_3_) {
+ IBlockState soil = p_196260_2_.func_180495_p(p_196260_3_.func_177977_b());
+ if (soil.canSustainPlant(p_196260_2_, p_196260_3_.func_177977_b(), EnumFacing.UP, this)) return true;
+
Block block = p_196260_2_.func_180495_p(p_196260_3_.func_177977_b()).func_177230_c();
if (block == this) {
return true;
@@ -91,4 +97,14 @@
public BlockFaceShape func_193383_a(IBlockReader p_193383_1_, IBlockState p_193383_2_, BlockPos p_193383_3_, EnumFacing p_193383_4_) {
return BlockFaceShape.UNDEFINED;
}
+
+ @Override
+ public net.minecraftforge.common.EnumPlantType getPlantType(IBlockReader world, BlockPos pos) {
+ return net.minecraftforge.common.EnumPlantType.Beach;
+ }
+
+ @Override
+ public IBlockState getPlant(IBlockReader world, BlockPos pos) {
+ return func_176223_P();
+ }
}
@@ -0,0 +1,18 @@
--- a/net/minecraft/block/BlockSapling.java
+++ b/net/minecraft/block/BlockSapling.java
@@ -29,6 +29,7 @@
public void func_196267_b(IBlockState p_196267_1_, World p_196267_2_, BlockPos p_196267_3_, Random p_196267_4_) {
super.func_196267_b(p_196267_1_, p_196267_2_, p_196267_3_, p_196267_4_);
+ if (!p_196267_2_.func_205050_e(p_196267_3_, 1)) return; // Forge: prevent loading unloaded chunks when checking neighbor's light
if (p_196267_2_.func_201696_r(p_196267_3_.func_177984_a()) >= 9 && p_196267_4_.nextInt(7) == 0) {
this.func_176478_d(p_196267_2_, p_196267_3_, p_196267_1_, p_196267_4_);
}
@@ -39,6 +40,7 @@
if (p_176478_3_.func_177229_b(field_176479_b) == 0) {
p_176478_1_.func_180501_a(p_176478_2_, p_176478_3_.func_177231_a(field_176479_b), 4);
} else {
+ if (!net.minecraftforge.event.ForgeEventFactory.saplingGrowTree(p_176478_1_, p_176478_4_, p_176478_2_)) return;
this.field_196387_c.func_196935_a(p_176478_1_, p_176478_2_, p_176478_3_, p_176478_4_);
}
@@ -0,0 +1,40 @@
--- a/net/minecraft/block/BlockSeaGrass.java
+++ b/net/minecraft/block/BlockSeaGrass.java
@@ -23,7 +23,7 @@
import net.minecraft.world.IWorld;
import net.minecraft.world.World;
-public class BlockSeaGrass extends BlockBush implements IGrowable, ILiquidContainer {
+public class BlockSeaGrass extends BlockBush implements IGrowable, ILiquidContainer, net.minecraftforge.common.IShearable {
protected static final VoxelShape field_207798_a = Block.func_208617_a(2.0D, 0.0D, 2.0D, 14.0D, 12.0D, 14.0D);
protected BlockSeaGrass(Block.Properties p_i48780_1_) {
@@ -54,11 +54,7 @@
}
public void func_180657_a(World p_180657_1_, EntityPlayer p_180657_2_, BlockPos p_180657_3_, IBlockState p_180657_4_, @Nullable TileEntity p_180657_5_, ItemStack p_180657_6_) {
- if (!p_180657_1_.field_72995_K && p_180657_6_.func_77973_b() == Items.field_151097_aZ) {
- p_180657_2_.func_71029_a(StatList.field_188065_ae.func_199076_b(this));
- p_180657_2_.func_71020_j(0.005F);
- func_180635_a(p_180657_1_, p_180657_3_, new ItemStack(this));
- } else {
+ {
super.func_180657_a(p_180657_1_, p_180657_2_, p_180657_3_, p_180657_4_, p_180657_5_, p_180657_6_);
}
@@ -102,4 +98,15 @@
public int func_200011_d(IBlockState p_200011_1_, IBlockReader p_200011_2_, BlockPos p_200011_3_) {
return Blocks.field_150355_j.func_176223_P().func_200016_a(p_200011_2_, p_200011_3_);
}
+
+ @Override
+ public boolean isShearable(ItemStack item, net.minecraft.world.IWorldReader world, BlockPos pos) {
+ return true;
+ }
+
+ @Override
+ public java.util.List<ItemStack> onSheared(ItemStack item, net.minecraft.world.IWorld world, BlockPos pos, int fortune) {
+ world.func_180501_a(pos, Blocks.field_150350_a.func_176223_P(), 11);
+ return java.util.Arrays.asList(new ItemStack(this));
+ }
}
@@ -0,0 +1,38 @@
--- a/net/minecraft/block/BlockShearableDoublePlant.java
+++ b/net/minecraft/block/BlockShearableDoublePlant.java
@@ -11,7 +11,7 @@
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
-public class BlockShearableDoublePlant extends BlockDoublePlant {
+public class BlockShearableDoublePlant extends BlockDoublePlant implements net.minecraftforge.common.IShearable {
public static final EnumProperty<DoubleBlockHalf> field_208063_b = BlockDoublePlant.field_176492_b;
private final Block field_196392_b;
@@ -26,9 +26,7 @@
}
protected void func_196391_a(IBlockState p_196391_1_, World p_196391_2_, BlockPos p_196391_3_, ItemStack p_196391_4_) {
- if (p_196391_4_.func_77973_b() == Items.field_151097_aZ) {
- func_180635_a(p_196391_2_, p_196391_3_, new ItemStack(this.field_196392_b, 2));
- } else {
+ {
super.func_196391_a(p_196391_1_, p_196391_2_, p_196391_3_, p_196391_4_);
}
@@ -37,4 +35,15 @@
public IItemProvider func_199769_a(IBlockState p_199769_1_, World p_199769_2_, BlockPos p_199769_3_, int p_199769_4_) {
return p_199769_1_.func_177229_b(field_208063_b) == DoubleBlockHalf.LOWER && this == Blocks.field_196804_gh && p_199769_2_.field_73012_v.nextInt(8) == 0 ? Items.field_151014_N : Items.field_190931_a;
}
+
+ @Override
+ public boolean isShearable(ItemStack item, net.minecraft.world.IWorldReader world, BlockPos pos) {
+ return true;
+ }
+
+ @Override
+ public java.util.List<ItemStack> onSheared(ItemStack item, net.minecraft.world.IWorld world, BlockPos pos, int fortune) {
+ world.func_180501_a(pos, Blocks.field_150350_a.func_176223_P(), 11);
+ return java.util.Arrays.asList(new ItemStack(this.field_196392_b, 2));
+ }
}
@@ -0,0 +1,54 @@
--- a/net/minecraft/block/BlockSnowLayer.java
+++ b/net/minecraft/block/BlockSnowLayer.java
@@ -84,30 +84,45 @@
public void func_180657_a(World p_180657_1_, EntityPlayer p_180657_2_, BlockPos p_180657_3_, IBlockState p_180657_4_, @Nullable TileEntity p_180657_5_, ItemStack p_180657_6_) {
Integer integer = p_180657_4_.func_177229_b(field_176315_a);
- if (this.func_149700_E() && EnchantmentHelper.func_77506_a(Enchantments.field_185306_r, p_180657_6_) > 0) {
+ net.minecraft.util.NonNullList<ItemStack> items = net.minecraft.util.NonNullList.func_191196_a();
+ int fortune = EnchantmentHelper.func_77506_a(Enchantments.field_185308_t, p_180657_6_);
+ float chance = 1.0f;
+
+ if (this.canSilkHarvest(p_180657_4_, p_180657_1_, p_180657_3_, p_180657_2_) && EnchantmentHelper.func_77506_a(Enchantments.field_185306_r, p_180657_6_) > 0) {
if (integer == 8) {
- func_180635_a(p_180657_1_, p_180657_3_, new ItemStack(Blocks.field_196604_cC));
+ items.add(new ItemStack(Blocks.field_196604_cC));
} else {
for(int i = 0; i < integer; ++i) {
- func_180635_a(p_180657_1_, p_180657_3_, this.func_180643_i(p_180657_4_));
+ items.add(this.func_180643_i(p_180657_4_));
}
}
+ chance = net.minecraftforge.event.ForgeEventFactory.fireBlockHarvesting(items, p_180657_1_, p_180657_3_, p_180657_4_, 0, 1.0f, true, p_180657_2_);
} else {
- func_180635_a(p_180657_1_, p_180657_3_, new ItemStack(Items.field_151126_ay, integer));
+ getDrops(p_180657_4_, items, p_180657_1_, p_180657_3_, fortune);
+ chance = net.minecraftforge.event.ForgeEventFactory.fireBlockHarvesting(items, p_180657_1_, p_180657_3_, p_180657_4_, fortune, 1.0f, false, p_180657_2_);
}
+ for (ItemStack item : items) {
+ if (p_180657_1_.field_73012_v.nextFloat() <= chance)
+ func_180635_a(p_180657_1_, p_180657_3_, item);
+ }
+
p_180657_1_.func_175698_g(p_180657_3_);
p_180657_2_.func_71029_a(StatList.field_188065_ae.func_199076_b(this));
p_180657_2_.func_71020_j(0.005F);
}
public IItemProvider func_199769_a(IBlockState p_199769_1_, World p_199769_2_, BlockPos p_199769_3_, int p_199769_4_) {
- return Items.field_190931_a;
+ return Items.field_151126_ay;
}
+ @Override
+ public int func_196264_a(IBlockState state, Random random) {
+ return state.func_177229_b(field_176315_a) + 1;
+ }
+
public void func_196267_b(IBlockState p_196267_1_, World p_196267_2_, BlockPos p_196267_3_, Random p_196267_4_) {
if (p_196267_2_.func_175642_b(EnumLightType.BLOCK, p_196267_3_) > 11) {
- p_196267_1_.func_196949_c(p_196267_2_, p_196267_3_, 0);
p_196267_2_.func_175698_g(p_196267_3_);
}
@@ -0,0 +1,55 @@
--- a/net/minecraft/block/BlockStem.java
+++ b/net/minecraft/block/BlockStem.java
@@ -39,22 +39,24 @@
public void func_196267_b(IBlockState p_196267_1_, World p_196267_2_, BlockPos p_196267_3_, Random p_196267_4_) {
super.func_196267_b(p_196267_1_, p_196267_2_, p_196267_3_, p_196267_4_);
+ if (!p_196267_2_.func_205050_e(p_196267_3_, 1)) return; // Forge: prevent loading unloaded chunks when checking neighbor's light
if (p_196267_2_.func_201669_a(p_196267_3_.func_177984_a(), 0) >= 9) {
float f = BlockCrops.func_180672_a(this, p_196267_2_, p_196267_3_);
- if (p_196267_4_.nextInt((int)(25.0F / f) + 1) == 0) {
+ if (net.minecraftforge.common.ForgeHooks.onCropsGrowPre(p_196267_2_, p_196267_3_, p_196267_1_, p_196267_4_.nextInt((int)(25.0F / f) + 1) == 0)) {
int i = p_196267_1_.func_177229_b(field_176484_a);
if (i < 7) {
- p_196267_1_ = p_196267_1_.func_206870_a(field_176484_a, Integer.valueOf(i + 1));
- p_196267_2_.func_180501_a(p_196267_3_, p_196267_1_, 2);
+ p_196267_2_.func_180501_a(p_196267_3_, p_196267_1_.func_206870_a(field_176484_a, i + 1), 2);
} else {
EnumFacing enumfacing = EnumFacing.Plane.HORIZONTAL.func_179518_a(p_196267_4_);
BlockPos blockpos = p_196267_3_.func_177972_a(enumfacing);
- Block block = p_196267_2_.func_180495_p(blockpos.func_177977_b()).func_177230_c();
- if (p_196267_2_.func_180495_p(blockpos).func_196958_f() && (block == Blocks.field_150458_ak || block == Blocks.field_150346_d || block == Blocks.field_196660_k || block == Blocks.field_196661_l || block == Blocks.field_196658_i)) {
+ IBlockState soil = p_196267_2_.func_180495_p(blockpos.func_177977_b());
+ Block block = soil.func_177230_c();
+ if (p_196267_2_.func_180495_p(blockpos).isAir(p_196267_2_, blockpos) && (soil.canSustainPlant(p_196267_2_, blockpos.func_177977_b(), EnumFacing.UP, this) || block == Blocks.field_150346_d || block == Blocks.field_196660_k || block == Blocks.field_196661_l || block == Blocks.field_196658_i)) {
p_196267_2_.func_175656_a(blockpos, this.field_149877_a.func_176223_P());
p_196267_2_.func_175656_a(p_196267_3_, this.field_149877_a.func_196523_e().func_176223_P().func_206870_a(BlockHorizontal.field_185512_D, enumfacing));
}
}
+ net.minecraftforge.common.ForgeHooks.onCropsGrowPost(p_196267_2_, p_196267_3_, p_196267_1_);
}
}
@@ -62,14 +64,18 @@
public void func_196255_a(IBlockState p_196255_1_, World p_196255_2_, BlockPos p_196255_3_, float p_196255_4_, int p_196255_5_) {
super.func_196255_a(p_196255_1_, p_196255_2_, p_196255_3_, p_196255_4_, p_196255_5_);
- if (!p_196255_2_.field_72995_K) {
+ }
+
+ @Override
+ public void getDrops(IBlockState state, net.minecraft.util.NonNullList<ItemStack> drops, World world, BlockPos pos, int fortune) {
+ {
Item item = this.func_176481_j();
if (item != null) {
- int i = p_196255_1_.func_177229_b(field_176484_a);
+ int i = state.func_177229_b(field_176484_a);
for(int j = 0; j < 3; ++j) {
- if (p_196255_2_.field_73012_v.nextInt(15) <= i) {
- func_180635_a(p_196255_2_, p_196255_3_, new ItemStack(item));
+ if (world.field_73012_v.nextInt(15) <= i) {
+ drops.add(new ItemStack(item));
}
}
@@ -0,0 +1,39 @@
--- a/net/minecraft/block/BlockTallGrass.java
+++ b/net/minecraft/block/BlockTallGrass.java
@@ -15,7 +15,7 @@
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
-public class BlockTallGrass extends BlockBush implements IGrowable {
+public class BlockTallGrass extends BlockBush implements IGrowable, net.minecraftforge.common.IShearable {
protected static final VoxelShape field_196389_a = Block.func_208617_a(2.0D, 0.0D, 2.0D, 14.0D, 13.0D, 14.0D);
protected BlockTallGrass(Block.Properties p_i48310_1_) {
@@ -27,7 +27,7 @@
}
public IItemProvider func_199769_a(IBlockState p_199769_1_, World p_199769_2_, BlockPos p_199769_3_, int p_199769_4_) {
- return p_199769_2_.field_73012_v.nextInt(8) == 0 ? Items.field_151014_N : Items.field_190931_a;
+ return Items.field_190931_a;
}
public int func_196251_a(IBlockState p_196251_1_, int p_196251_2_, World p_196251_3_, BlockPos p_196251_4_, Random p_196251_5_) {
@@ -64,4 +64,18 @@
public Block.EnumOffsetType func_176218_Q() {
return Block.EnumOffsetType.XYZ;
}
+
+ @Override
+ public java.util.List<ItemStack> onSheared(ItemStack item, net.minecraft.world.IWorld world, BlockPos pos, int fortune) {
+ world.func_180501_a(pos, Blocks.field_150350_a.func_176223_P(), 11);
+ return java.util.Arrays.asList(new ItemStack(this));
+ }
+
+ @Override
+ public void getDrops(IBlockState state, net.minecraft.util.NonNullList<ItemStack> drops, World world, BlockPos pos, int fortune) {
+ if (world.field_73012_v.nextInt(8) != 0) return;
+ ItemStack seed = net.minecraftforge.common.ForgeHooks.getGrassSeed(world.field_73012_v, fortune);
+ if (!seed.func_190926_b())
+ drops.add(seed);
+ }
}
@@ -0,0 +1,13 @@
--- a/net/minecraft/block/BlockTorch.java
+++ b/net/minecraft/block/BlockTorch.java
@@ -37,9 +37,7 @@
public boolean func_196260_a(IBlockState p_196260_1_, IWorldReaderBase p_196260_2_, BlockPos p_196260_3_) {
IBlockState iblockstate = p_196260_2_.func_180495_p(p_196260_3_.func_177977_b());
- Block block = iblockstate.func_177230_c();
- boolean flag = block instanceof BlockFence || block instanceof BlockStainedGlass || block == Blocks.field_150359_w || block == Blocks.field_150463_bK || block == Blocks.field_196723_eg || iblockstate.func_185896_q();
- return flag && block != Blocks.field_185775_db;
+ return iblockstate.canPlaceTorchOnTop(p_196260_2_, p_196260_3_);
}
@OnlyIn(Dist.CLIENT)
@@ -0,0 +1,17 @@
--- a/net/minecraft/block/BlockTrapDoor.java
+++ b/net/minecraft/block/BlockTrapDoor.java
@@ -186,4 +186,14 @@
return super.func_196271_a(p_196271_1_, p_196271_2_, p_196271_3_, p_196271_4_, p_196271_5_, p_196271_6_);
}
+
+ @Override
+ public boolean isLadder(IBlockState state, net.minecraft.world.IWorldReader world, BlockPos pos, net.minecraft.entity.EntityLivingBase entity) {
+ if (state.func_177229_b(field_176283_b)) {
+ IBlockState down = world.func_180495_p(pos.func_177977_b());
+ if (down.func_177230_c() == net.minecraft.init.Blocks.field_150468_ap)
+ return down.func_177229_b(BlockLadder.field_176382_a) == state.func_177229_b(field_185512_D);
+ }
+ return false;
+ }
}
@@ -0,0 +1,36 @@
--- a/net/minecraft/block/BlockVine.java
+++ b/net/minecraft/block/BlockVine.java
@@ -29,7 +29,7 @@
import net.minecraft.world.IWorldReaderBase;
import net.minecraft.world.World;
-public class BlockVine extends Block {
+public class BlockVine extends Block implements net.minecraftforge.common.IShearable {
public static final BooleanProperty field_176277_a = BlockSixWay.field_196496_z;
public static final BooleanProperty field_176273_b = BlockSixWay.field_196488_a;
public static final BooleanProperty field_176278_M = BlockSixWay.field_196490_b;
@@ -171,7 +171,7 @@
p_196267_2_.func_175698_g(p_196267_3_);
}
- } else if (p_196267_2_.field_73012_v.nextInt(4) == 0) {
+ } else if (p_196267_2_.field_73012_v.nextInt(4) == 0 && p_196267_2_.func_205050_e(p_196267_3_, 4)) { // Forge: check area to prevent loading unloaded chunks
EnumFacing enumfacing = EnumFacing.func_176741_a(p_196267_4_);
BlockPos blockpos = p_196267_3_.func_177984_a();
if (enumfacing.func_176740_k().func_176722_c() && !p_196267_1_.func_177229_b(func_176267_a(enumfacing))) {
@@ -365,4 +365,15 @@
public BlockFaceShape func_193383_a(IBlockReader p_193383_1_, IBlockState p_193383_2_, BlockPos p_193383_3_, EnumFacing p_193383_4_) {
return BlockFaceShape.UNDEFINED;
}
+
+ @Override
+ public boolean isLadder(IBlockState state, net.minecraft.world.IWorldReader world, BlockPos pos, net.minecraft.entity.EntityLivingBase entity) {
+ return true;
+ }
+
+ @Override
+ public java.util.List<ItemStack> onSheared(ItemStack item, net.minecraft.world.IWorld world, BlockPos pos, int fortune) {
+ world.func_180501_a(pos, Blocks.field_150350_a.func_176223_P(), 11);
+ return java.util.Arrays.asList(new ItemStack(this));
+ }
}
@@ -0,0 +1,44 @@
--- a/net/minecraft/block/BlockWall.java
+++ b/net/minecraft/block/BlockWall.java
@@ -51,6 +51,18 @@
return !func_194143_e(block) && p_196421_2_ == BlockFaceShape.SOLID || flag;
}
+ @Override
+ public boolean canBeConnectedTo(IBlockState state, IBlockReader world, BlockPos pos, EnumFacing facing) {
+ IBlockState other = world.func_180495_p(pos.func_177972_a(facing));
+ return func_196421_a(other, other.func_193401_d(world, pos.func_177972_a(facing), facing.func_176734_d()));
+ }
+
+ private boolean canWallConnectTo(IBlockReader world, BlockPos pos, EnumFacing facing) {
+ BlockPos off = pos.func_177972_a(facing);
+ IBlockState other = world.func_180495_p(off);
+ return other.canBeConnectedTo(world, off, facing.func_176734_d()) || func_196421_a(other, other.func_193401_d(world, off, facing.func_176734_d()));
+ }
+
public static boolean func_194143_e(Block p_194143_0_) {
return Block.func_193382_c(p_194143_0_) || p_194143_0_ == Blocks.field_180401_cv || p_194143_0_ == Blocks.field_150440_ba || p_194143_0_ == Blocks.field_150423_aK || p_194143_0_ == Blocks.field_196625_cS || p_194143_0_ == Blocks.field_196628_cT || p_194143_0_ == Blocks.field_185778_de || p_194143_0_ == Blocks.field_150335_W;
}
@@ -59,18 +71,10 @@
IWorldReaderBase iworldreaderbase = p_196258_1_.func_195991_k();
BlockPos blockpos = p_196258_1_.func_195995_a();
IFluidState ifluidstate = p_196258_1_.func_195991_k().func_204610_c(p_196258_1_.func_195995_a());
- BlockPos blockpos1 = blockpos.func_177978_c();
- BlockPos blockpos2 = blockpos.func_177974_f();
- BlockPos blockpos3 = blockpos.func_177968_d();
- BlockPos blockpos4 = blockpos.func_177976_e();
- IBlockState iblockstate = iworldreaderbase.func_180495_p(blockpos1);
- IBlockState iblockstate1 = iworldreaderbase.func_180495_p(blockpos2);
- IBlockState iblockstate2 = iworldreaderbase.func_180495_p(blockpos3);
- IBlockState iblockstate3 = iworldreaderbase.func_180495_p(blockpos4);
- boolean flag = this.func_196421_a(iblockstate, iblockstate.func_193401_d(iworldreaderbase, blockpos1, EnumFacing.SOUTH));
- boolean flag1 = this.func_196421_a(iblockstate1, iblockstate1.func_193401_d(iworldreaderbase, blockpos2, EnumFacing.WEST));
- boolean flag2 = this.func_196421_a(iblockstate2, iblockstate2.func_193401_d(iworldreaderbase, blockpos3, EnumFacing.NORTH));
- boolean flag3 = this.func_196421_a(iblockstate3, iblockstate3.func_193401_d(iworldreaderbase, blockpos4, EnumFacing.EAST));
+ boolean flag = canWallConnectTo(iworldreaderbase, blockpos, EnumFacing.NORTH);
+ boolean flag1 = canWallConnectTo(iworldreaderbase, blockpos, EnumFacing.EAST);
+ boolean flag2 = canWallConnectTo(iworldreaderbase, blockpos, EnumFacing.SOUTH);
+ boolean flag3 = canWallConnectTo(iworldreaderbase, blockpos, EnumFacing.WEST);
boolean flag4 = (!flag || flag1 || !flag2 || flag3) && (flag || !flag1 || flag2 || !flag3);
return this.func_176223_P().func_206870_a(field_176256_a, Boolean.valueOf(flag4 || !iworldreaderbase.func_175623_d(blockpos.func_177984_a()))).func_206870_a(field_196409_a, Boolean.valueOf(flag)).func_206870_a(field_196411_b, Boolean.valueOf(flag1)).func_206870_a(field_196413_c, Boolean.valueOf(flag2)).func_206870_a(field_196414_y, Boolean.valueOf(flag3)).func_206870_a(field_204514_u, Boolean.valueOf(ifluidstate.func_206886_c() == Fluids.field_204546_a));
}
@@ -0,0 +1,30 @@
--- a/net/minecraft/block/BlockWeb.java
+++ b/net/minecraft/block/BlockWeb.java
@@ -5,6 +5,7 @@
import net.minecraft.block.state.IBlockState;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.init.Blocks;
import net.minecraft.init.Items;
import net.minecraft.item.ItemStack;
import net.minecraft.stats.StatList;
@@ -16,7 +17,7 @@
import net.minecraft.world.IBlockReader;
import net.minecraft.world.World;
-public class BlockWeb extends Block {
+public class BlockWeb extends Block implements net.minecraftforge.common.IShearable {
public BlockWeb(Block.Properties p_i48296_1_) {
super(p_i48296_1_);
}
@@ -54,4 +55,10 @@
public BlockFaceShape func_193383_a(IBlockReader p_193383_1_, IBlockState p_193383_2_, BlockPos p_193383_3_, EnumFacing p_193383_4_) {
return BlockFaceShape.UNDEFINED;
}
+
+ @Override
+ public java.util.List<ItemStack> onSheared(ItemStack item, net.minecraft.world.IWorld world, BlockPos pos, int fortune) {
+ world.func_180501_a(pos, Blocks.field_150350_a.func_176223_P(), 11);
+ return java.util.Arrays.asList(new ItemStack(this));
+ }
}
@@ -0,0 +1,10 @@
--- a/net/minecraft/block/ITileEntityProvider.java
+++ b/net/minecraft/block/ITileEntityProvider.java
@@ -4,6 +4,7 @@
import net.minecraft.tileentity.TileEntity;
import net.minecraft.world.IBlockReader;
+@Deprecated //Forge: Do not use, use IBlockState.hasTileEntity/Blocks.createTileEntity
public interface ITileEntityProvider {
@Nullable
TileEntity func_196283_a_(IBlockReader p_196283_1_);
@@ -0,0 +1,27 @@
--- a/net/minecraft/block/SoundType.java
+++ b/net/minecraft/block/SoundType.java
@@ -2,8 +2,6 @@
import net.minecraft.init.SoundEvents;
import net.minecraft.util.SoundEvent;
-import net.minecraftforge.api.distmarker.Dist;
-import net.minecraftforge.api.distmarker.OnlyIn;
public class SoundType {
public static final SoundType field_185848_a = new SoundType(1.0F, 1.0F, SoundEvents.field_187881_gQ, SoundEvents.field_187897_gY, SoundEvents.field_187891_gV, SoundEvents.field_187889_gU, SoundEvents.field_187887_gT);
@@ -46,7 +44,6 @@
return this.field_185861_n;
}
- @OnlyIn(Dist.CLIENT)
public SoundEvent func_185845_c() {
return this.field_185862_o;
}
@@ -59,7 +56,6 @@
return this.field_185864_q;
}
- @OnlyIn(Dist.CLIENT)
public SoundEvent func_185846_f() {
return this.field_185865_r;
}
@@ -0,0 +1,53 @@
--- a/net/minecraft/block/state/BlockPistonStructureHelper.java
+++ b/net/minecraft/block/state/BlockPistonStructureHelper.java
@@ -51,7 +51,7 @@
} else {
for(int i = 0; i < this.field_177258_e.size(); ++i) {
BlockPos blockpos = this.field_177258_e.get(i);
- if (this.field_177261_a.func_180495_p(blockpos).func_177230_c() == Blocks.field_180399_cE && !this.func_177250_b(blockpos)) {
+ if (this.field_177261_a.func_180495_p(blockpos).isStickyBlock() && !this.func_177250_b(blockpos)) {
return false;
}
}
@@ -62,8 +62,7 @@
private boolean func_177251_a(BlockPos p_177251_1_, EnumFacing p_177251_2_) {
IBlockState iblockstate = this.field_177261_a.func_180495_p(p_177251_1_);
- Block block = iblockstate.func_177230_c();
- if (iblockstate.func_196958_f()) {
+ if (iblockstate.isAir(field_177261_a, p_177251_1_)) {
return true;
} else if (!BlockPistonBase.func_185646_a(iblockstate, this.field_177261_a, p_177251_1_, this.field_177257_d, false, p_177251_2_)) {
return true;
@@ -76,11 +75,10 @@
if (i + this.field_177258_e.size() > 12) {
return false;
} else {
- while(block == Blocks.field_180399_cE) {
+ while(iblockstate.isStickyBlock()) {
BlockPos blockpos = p_177251_1_.func_177967_a(this.field_177257_d.func_176734_d(), i);
iblockstate = this.field_177261_a.func_180495_p(blockpos);
- block = iblockstate.func_177230_c();
- if (iblockstate.func_196958_f() || !BlockPistonBase.func_185646_a(iblockstate, this.field_177261_a, blockpos, this.field_177257_d, false, this.field_177257_d.func_176734_d()) || blockpos.equals(this.field_177259_b)) {
+ if (iblockstate.isAir(field_177261_a, blockpos) || !BlockPistonBase.func_185646_a(iblockstate, this.field_177261_a, blockpos, this.field_177257_d, false, this.field_177257_d.func_176734_d()) || blockpos.equals(this.field_177259_b)) {
break;
}
@@ -107,7 +105,7 @@
for(int l = 0; l <= k + i1; ++l) {
BlockPos blockpos2 = this.field_177258_e.get(l);
- if (this.field_177261_a.func_180495_p(blockpos2).func_177230_c() == Blocks.field_180399_cE && !this.func_177250_b(blockpos2)) {
+ if (this.field_177261_a.func_180495_p(blockpos2).isStickyBlock() && !this.func_177250_b(blockpos2)) {
return false;
}
}
@@ -116,7 +114,7 @@
}
iblockstate = this.field_177261_a.func_180495_p(blockpos1);
- if (iblockstate.func_196958_f()) {
+ if (iblockstate.isAir(field_177261_a, blockpos1)) {
return true;
}
@@ -6,6 +6,24 @@
-public interface IBlockState extends IStateHolder<IBlockState> {
+public interface IBlockState extends IStateHolder<IBlockState>, net.minecraftforge.common.extensions.IForgeBlockState {
ThreadLocal<Object2ByteMap<IBlockState>> field_208776_a = ThreadLocal.<Object2ByteMap<IBlockState>>withInitial(() -> {
Object2ByteOpenHashMap<IBlockState> object2byteopenhashmap = new Object2ByteOpenHashMap<IBlockState>();
ThreadLocal<Object2ByteMap<IBlockState>> field_208776_a = ThreadLocal.withInitial(() -> {
Object2ByteOpenHashMap<IBlockState> object2byteopenhashmap = new Object2ByteOpenHashMap<>();
object2byteopenhashmap.defaultReturnValue((byte)127);
@@ -97,6 +97,8 @@
return this.func_177230_c().func_149750_m(this);
}
+ /** @deprecated use {@link IBlockState#isAir(IBlockReader, BlockPos) */
+ @Deprecated
default boolean func_196958_f() {
return this.func_177230_c().func_196261_e(this);
}
@@ -109,6 +111,8 @@
return this.func_177230_c().func_180659_g(this, p_185909_1_, p_185909_2_);
}
+ /** @deprecated use {@link IBlockState#rotate(IWorld, BlockPos, Rotation) */
+ @Deprecated
default IBlockState func_185907_a(Rotation p_185907_1_) {
return this.func_177230_c().func_185499_a(this, p_185907_1_);
}
@@ -0,0 +1,16 @@
--- a/net/minecraft/block/trees/JungleTree.java
+++ b/net/minecraft/block/trees/JungleTree.java
@@ -11,11 +11,11 @@
public class JungleTree extends AbstractBigTree {
@Nullable
protected AbstractTreeFeature<NoFeatureConfig> func_196936_b(Random p_196936_1_) {
- return new TreeFeature(true, 4 + p_196936_1_.nextInt(7), Blocks.field_196620_N.func_176223_P(), Blocks.field_196648_Z.func_176223_P(), false);
+ return new TreeFeature(true, 4 + p_196936_1_.nextInt(7), Blocks.field_196620_N.func_176223_P(), Blocks.field_196648_Z.func_176223_P(), false).setSapling((net.minecraft.block.BlockSapling)Blocks.field_196678_w);
}
@Nullable
protected AbstractTreeFeature<NoFeatureConfig> func_196938_a(Random p_196938_1_) {
- return new MegaJungleFeature(true, 10, 20, Blocks.field_196620_N.func_176223_P(), Blocks.field_196648_Z.func_176223_P());
+ return new MegaJungleFeature(true, 10, 20, Blocks.field_196620_N.func_176223_P(), Blocks.field_196648_Z.func_176223_P()).setSapling((net.minecraft.block.BlockSapling)Blocks.field_196678_w);
}
}
@@ -0,0 +1,91 @@
--- a/net/minecraft/client/GameSettings.java
+++ b/net/minecraft/client/GameSettings.java
@@ -167,6 +167,7 @@
public boolean field_211842_aO;
public GameSettings(Minecraft p_i46326_1_, File p_i46326_2_) {
+ setForgeKeybindProperties();
this.field_74317_L = p_i46326_1_;
this.field_74354_ai = new File(p_i46326_2_, "options.txt");
if (p_i46326_1_.func_147111_S() && Runtime.getRuntime().maxMemory() >= 1000000000L) {
@@ -180,6 +181,7 @@
}
public GameSettings() {
+ setForgeKeybindProperties();
}
public void func_198014_a(KeyBinding p_198014_1_, InputMappings.Input p_198014_2_) {
@@ -236,7 +238,7 @@
this.field_74317_L.func_147117_R().func_147633_a(this.field_151442_I);
this.field_74317_L.func_110434_K().func_110577_a(TextureMap.field_110575_b);
this.field_74317_L.func_147117_R().func_174937_a(false, this.field_151442_I > 0);
- this.field_74317_L.func_175603_A();
+ this.needsBlockModelRefresh = true; // FORGE: fix for MC-64581 very laggy mipmap slider
}
}
@@ -846,7 +848,11 @@
for(KeyBinding keybinding : this.field_74324_K) {
if (s1.equals("key_" + keybinding.func_151464_g())) {
- keybinding.func_197979_b(InputMappings.func_197955_a(s2));
+ if (s2.indexOf(':') != -1) {
+ String[] pts = s2.split(":");
+ keybinding.setKeyModifierAndCode(net.minecraftforge.client.settings.KeyModifier.valueFromString(pts[1]), InputMappings.func_197955_a(pts[0]));
+ } else
+ keybinding.setKeyModifierAndCode(net.minecraftforge.client.settings.KeyModifier.NONE, InputMappings.func_197955_a(s2));
}
}
@@ -894,6 +900,7 @@
}
public void func_74303_b() {
+ if (net.minecraftforge.fml.client.ClientModLoader.isLoading()) return; //Don't save settings before mods add keybindigns and the like to prevent them from being deleted.
PrintWriter printwriter = null;
try {
@@ -971,7 +978,7 @@
printwriter.println("glDebugVerbosity:" + this.field_209231_W);
for(KeyBinding keybinding : this.field_74324_K) {
- printwriter.println("key_" + keybinding.func_151464_g() + ":" + keybinding.func_197982_m());
+ printwriter.println("key_" + keybinding.func_151464_g() + ":" + keybinding.func_197982_m() + (keybinding.getKeyModifier() != net.minecraftforge.client.settings.KeyModifier.NONE ? ":" + keybinding.getKeyModifier() : ""));
}
for(SoundCategory soundcategory : SoundCategory.values()) {
@@ -1073,6 +1080,33 @@
p_198017_1_.func_198985_a(set);
}
+ private void setForgeKeybindProperties() {
+ net.minecraftforge.client.settings.KeyConflictContext inGame = net.minecraftforge.client.settings.KeyConflictContext.IN_GAME;
+ field_74351_w.setKeyConflictContext(inGame);
+ field_74370_x.setKeyConflictContext(inGame);
+ field_74368_y.setKeyConflictContext(inGame);
+ field_74366_z.setKeyConflictContext(inGame);
+ field_74314_A.setKeyConflictContext(inGame);
+ field_74311_E.setKeyConflictContext(inGame);
+ field_151444_V.setKeyConflictContext(inGame);
+ field_74312_F.setKeyConflictContext(inGame);
+ field_74310_D.setKeyConflictContext(inGame);
+ field_74321_H.setKeyConflictContext(inGame);
+ field_74323_J.setKeyConflictContext(inGame);
+ field_151457_aa.setKeyConflictContext(inGame);
+ field_151458_ab.setKeyConflictContext(inGame);
+ field_186718_X.setKeyConflictContext(inGame);
+ }
+
+ // FORGE: fix for MC-64581 very laggy mipmap slider
+ private boolean needsBlockModelRefresh = false;
+ public void onGuiClosed() {
+ if (needsBlockModelRefresh) {
+ this.field_74317_L.func_152344_a(() -> net.minecraftforge.client.ForgeHooksClient.refreshResources(this.field_74317_L, net.minecraftforge.resource.VanillaResourceType.MODELS));
+ this.needsBlockModelRefresh = false;
+ }
+ }
+
@OnlyIn(Dist.CLIENT)
public static enum Options {
INVERT_MOUSE("options.invertMouse", false, true),
@@ -0,0 +1,66 @@
--- a/net/minecraft/client/KeyboardListener.java
+++ b/net/minecraft/client/KeyboardListener.java
@@ -246,7 +246,8 @@
}
IGuiEventListener iguieventlistener = this.field_197972_a.field_71462_r;
- if (p_197961_5_ == 1 && (!(this.field_197972_a.field_71462_r instanceof GuiControls) || ((GuiControls)iguieventlistener).field_152177_g <= Util.func_211177_b() - 20L)) {
+ if ((!(this.field_197972_a.field_71462_r instanceof GuiControls) || ((GuiControls)iguieventlistener).field_152177_g <= Util.func_211177_b() - 20L)) {
+ if (p_197961_5_ == 1) {
if (this.field_197972_a.field_71474_y.field_152395_am.func_197976_a(p_197961_3_, p_197961_4_)) {
this.field_197972_a.field_195558_d.func_198077_g();
return;
@@ -264,6 +265,8 @@
});
return;
}
+ } else if (p_197961_5_ == 0 /*GLFW_RELEASE*/ && this.field_197972_a.field_71462_r instanceof GuiControls)
+ ((GuiControls)this.field_197972_a.field_71462_r).field_146491_f = null; //Forge: Unset pure modifiers.
}
if (iguieventlistener != null) {
@@ -271,10 +274,14 @@
GuiScreen.func_195121_a(() -> {
if (p_197961_5_ != 1 && (p_197961_5_ != 2 || !this.field_197973_b)) {
if (p_197961_5_ == 0) {
- aboolean[0] = iguieventlistener.keyReleased(p_197961_3_, p_197961_4_, p_197961_6_);
+ aboolean[0] = net.minecraftforge.client.ForgeHooksClient.onGuiKeyReleasedPre(this.field_197972_a.field_71462_r, p_197961_3_, p_197961_4_, p_197961_6_);
+ if (!aboolean[0]) aboolean[0] = iguieventlistener.keyReleased(p_197961_3_, p_197961_4_, p_197961_6_);
+ if (!aboolean[0]) aboolean[0] = net.minecraftforge.client.ForgeHooksClient.onGuiKeyReleasedPost(this.field_197972_a.field_71462_r, p_197961_3_, p_197961_4_, p_197961_6_);
}
} else {
- aboolean[0] = iguieventlistener.keyPressed(p_197961_3_, p_197961_4_, p_197961_6_);
+ aboolean[0] = net.minecraftforge.client.ForgeHooksClient.onGuiKeyPressedPre(this.field_197972_a.field_71462_r, p_197961_3_, p_197961_4_, p_197961_6_);
+ if (!aboolean[0]) aboolean[0] = iguieventlistener.keyPressed(p_197961_3_, p_197961_4_, p_197961_6_);
+ if (!aboolean[0]) aboolean[0] = net.minecraftforge.client.ForgeHooksClient.onGuiKeyPressedPost(this.field_197972_a.field_71462_r, p_197961_3_, p_197961_4_, p_197961_6_);
}
}, "keyPressed event handler", iguieventlistener.getClass().getCanonicalName());
@@ -341,7 +348,7 @@
}
}
}
-
+ net.minecraftforge.client.ForgeHooksClient.fireKeyInput(p_197961_3_, p_197961_4_, p_197961_5_, p_197961_6_);
}
}
@@ -351,12 +358,16 @@
if (iguieventlistener != null) {
if (Character.charCount(p_197963_3_) == 1) {
GuiScreen.func_195121_a(() -> {
- iguieventlistener.charTyped((char)p_197963_3_, p_197963_4_);
+ if (net.minecraftforge.client.ForgeHooksClient.onGuiCharTypedPre(this.field_197972_a.field_71462_r, (char)p_197963_3_, p_197963_4_)) return;
+ if (iguieventlistener.charTyped((char)p_197963_3_, p_197963_4_)) return;
+ net.minecraftforge.client.ForgeHooksClient.onGuiCharTypedPost(this.field_197972_a.field_71462_r, (char)p_197963_3_, p_197963_4_);
}, "charTyped event handler", iguieventlistener.getClass().getCanonicalName());
} else {
for(char c0 : Character.toChars(p_197963_3_)) {
GuiScreen.func_195121_a(() -> {
- iguieventlistener.charTyped(c0, p_197963_4_);
+ if (net.minecraftforge.client.ForgeHooksClient.onGuiCharTypedPre(this.field_197972_a.field_71462_r, c0, p_197963_4_)) return;
+ if (iguieventlistener.charTyped(c0, p_197963_4_)) return;
+ net.minecraftforge.client.ForgeHooksClient.onGuiCharTypedPost(this.field_197972_a.field_71462_r, c0, p_197963_4_);
}, "charTyped event handler", iguieventlistener.getClass().getCanonicalName());
}
}
@@ -1,6 +1,31 @@
--- a/net/minecraft/client/Minecraft.java
+++ b/net/minecraft/client/Minecraft.java
@@ -405,6 +405,7 @@
@@ -297,6 +297,7 @@
public Minecraft(GameConfiguration p_i45547_1_) {
this.field_195556_O = p_i45547_1_.field_178743_b;
field_71432_P = this;
+ net.minecraftforge.client.ForgeHooksClient.invalidateLog4jThreadCache();
this.field_71412_D = p_i45547_1_.field_178744_c.field_178760_a;
this.field_110446_Y = p_i45547_1_.field_178744_c.field_178759_c;
this.field_130070_K = p_i45547_1_.field_178744_c.field_178758_b;
@@ -314,7 +315,7 @@
supplier = p_211818_2_;
}
- return new ResourcePackInfoClient(p_211818_0_, p_211818_1_, supplier, p_211818_3_, p_211818_4_, p_211818_5_);
+ return new ResourcePackInfoClient(p_211818_0_, p_211818_1_, supplier, p_211818_3_, p_211818_4_, p_211818_5_, p_211818_3_.isHidden());
});
this.field_110448_aq.func_198982_a(this.field_195554_ax);
this.field_110448_aq.func_198982_a(new FolderPackFinder(this.field_130070_K));
@@ -322,7 +323,6 @@
this.field_152355_az = (new YggdrasilAuthenticationService(this.field_110453_aa, UUID.randomUUID().toString())).createMinecraftSessionService();
this.field_71449_j = p_i45547_1_.field_178745_a.field_178752_a;
field_147123_G.info("Setting user: {}", (Object)this.field_71449_j.func_111285_a());
- field_147123_G.debug("(Session ID is {})", (Object)this.field_71449_j.func_111286_b());
this.field_71459_aj = p_i45547_1_.field_178741_d.field_178756_a;
this.field_147129_ai = func_147122_X();
this.field_71437_Z = null;
@@ -409,9 +409,11 @@
this.field_135017_as = new LanguageManager(this.field_71474_y.field_74363_ab);
this.field_110451_am.func_199006_a(this.field_135017_as);
this.field_71474_y.func_198017_a(this.field_110448_aq);
@@ -8,15 +33,57 @@
this.func_110436_a();
this.field_71446_o = new TextureManager(this.field_110451_am);
this.field_110451_am.func_199006_a(this.field_71446_o);
@@ -461,6 +462,7 @@
+ //net.minecraftforge.fml.client.SplashProgress.drawVanillaScreen(this.textureManager);
this.field_195558_d.func_198098_h();
this.func_147108_a(new GuiScreenLoading());
this.func_195547_ap();
@@ -429,6 +431,8 @@
this.field_110451_am.func_199006_a(new GrassColorReloadListener());
this.field_110451_am.func_199006_a(new FoliageColorReloadListener());
+ try (net.minecraftforge.fml.common.progress.ProgressBar bar = net.minecraftforge.fml.common.progress.StartupProgressManager.start("Rendering Setup", 5, true)) {
+ bar.step("GL Setup");
this.field_195558_d.func_198076_a("Startup");
GlStateManager.func_179098_w();
GlStateManager.func_179103_j(7425);
@@ -442,19 +446,24 @@
GlStateManager.func_179096_D();
GlStateManager.func_179128_n(5888);
this.field_195558_d.func_198076_a("Post startup");
+ bar.step("Loading Texture Map");
this.field_147128_au = new TextureMap("textures");
this.field_147128_au.func_147633_a(this.field_71474_y.field_151442_I);
this.field_71446_o.func_110580_a(TextureMap.field_110575_b, this.field_147128_au);
this.field_71446_o.func_110577_a(TextureMap.field_110575_b);
this.field_147128_au.func_174937_a(false, this.field_71474_y.field_151442_I > 0);
+ bar.step("Loading Model Manager");
this.field_175617_aL = new ModelManager(this.field_147128_au);
this.field_110451_am.func_199006_a(this.field_175617_aL);
this.field_184127_aH = BlockColors.func_186723_a();
this.field_184128_aI = ItemColors.func_186729_a(this.field_184127_aH);
+ bar.step("Loading Item Renderer");
this.field_175621_X = new ItemRenderer(this.field_71446_o, this.field_175617_aL, this.field_184128_aI);
this.field_175616_W = new RenderManager(this.field_71446_o, this.field_175621_X);
this.field_175620_Y = new FirstPersonRenderer(this);
this.field_110451_am.func_199006_a(this.field_175621_X);
+ bar.step("Loading Entity Renderer");
+ //net.minecraftforge.fml.client.SplashProgress.pause();
this.field_71460_t = new GameRenderer(this, this.field_110451_am);
this.field_110451_am.func_199006_a(this.field_71460_t);
this.field_175618_aM = new BlockRendererDispatcher(this.field_175617_aL.func_174954_c(), this.field_184127_aH);
@@ -465,7 +474,10 @@
this.field_110451_am.func_199006_a(this.field_193995_ae);
GlStateManager.func_179083_b(0, 0, this.field_195558_d.func_198109_k(), this.field_195558_d.func_198091_l());
this.field_71452_i = new ParticleManager(this.field_71441_e, this.field_71446_o);
- this.field_71456_v = new GuiIngame(this);
+ //net.minecraftforge.fml.client.SplashProgress.resume();
+ }; // Forge: end progress bar
+ net.minecraftforge.fml.client.ClientModLoader.end();
this.field_71456_v = new GuiIngame(this);
+ this.field_71456_v = new net.minecraftforge.client.GuiIngameForge(this);
if (this.field_71475_ae != null) {
this.func_147108_a(new GuiConnecting(new GuiMainMenu(), this, this.field_71475_ae, this.field_71477_af));
@@ -470,6 +472,7 @@
} else {
@@ -474,6 +486,7 @@
this.field_184132_p = new DebugRenderer(this);
GLFW.glfwSetErrorCallback(this::func_195545_a).free();
@@ -24,20 +91,338 @@
if (this.field_71474_y.field_74353_u && !this.field_195558_d.func_198113_j()) {
this.field_195558_d.func_198077_g();
}
@@ -485,7 +488,7 @@
@@ -489,7 +502,7 @@
});
List<String> list = Lists.<String>newArrayList();
List<String> list = Lists.newArrayList();
GLFWErrorCallback glfwerrorcallback = GLFW.glfwSetErrorCallback((p_211100_1_, p_211100_2_) -> {
- list.add(String.format("GLFW error during init: [0x%X]%s", p_211100_1_, p_211100_2_));
+ list.add(String.format("GLFW error during init: [0x%X] %s", p_211100_1_, GLFWErrorCallback.getDescription(p_211100_2_)));
});
if (!GLFW.glfwInit()) {
throw new IllegalStateException("Failed to initialize GLFW, errors: " + Joiner.on(",").join(list));
@@ -1392,6 +1395,7 @@
NetworkManager networkmanager = NetworkManager.func_150722_a(socketaddress);
@@ -599,7 +612,7 @@
Bootstrap.func_179870_a(p_71377_1_.func_71502_e());
if (p_71377_1_.func_71497_f() != null) {
Bootstrap.func_179870_a("#@!@# Game crashed! Crash report saved to: #@!@# " + p_71377_1_.func_71497_f());
- System.exit(-1);
+ net.minecraftforge.fml.server.ServerLifecycleHooks.handleExit(-1);
} else if (p_71377_1_.func_147149_a(file2)) {
Bootstrap.func_179870_a("#@!@# Game crashed! Crash report saved to: #@!@# " + file2.getAbsolutePath());
System.exit(-1);
@@ -614,6 +627,7 @@
return this.field_71474_y.field_211842_aO;
}
+ @Deprecated // Forge: Use selective refreshResources method in FMLClientHandler
public void func_110436_a() {
this.field_110448_aq.func_198983_a();
List<IResourcePack> list = this.field_110448_aq.func_198980_d().stream().map(ResourcePackInfo::func_195796_e).collect(Collectors.toList());
@@ -668,16 +682,20 @@
}
public void func_147108_a(@Nullable GuiScreen p_147108_1_) {
- if (this.field_71462_r != null) {
- this.field_71462_r.func_146281_b();
- }
-
if (p_147108_1_ == null && this.field_71441_e == null) {
p_147108_1_ = new GuiMainMenu();
} else if (p_147108_1_ == null && this.field_71439_g.func_110143_aJ() <= 0.0F) {
p_147108_1_ = new GuiGameOver((ITextComponent)null);
}
+ GuiScreen old = this.field_71462_r;
+ net.minecraftforge.client.event.GuiOpenEvent event = new net.minecraftforge.client.event.GuiOpenEvent(p_147108_1_);
+ if (net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(event)) return;
+
+ p_147108_1_ = event.getGui();
+ if (old != null && p_147108_1_ != old)
+ old.func_146281_b();
+
if (p_147108_1_ instanceof GuiMainMenu || p_147108_1_ instanceof GuiMultiplayer) {
this.field_71474_y.field_74330_P = false;
this.field_71456_v.func_146158_b().func_146231_a(true);
@@ -761,7 +779,7 @@
GLFW.glfwPollEvents();
long i1 = Util.func_211178_c() - l;
this.field_71424_I.func_76318_c("sound");
- this.field_147127_av.func_147691_a(this.field_71439_g, this.field_71428_T.field_194147_b);
+ this.field_147127_av.setListener(this.func_175606_aa(), this.field_71428_T.field_194147_b); //Forge: MC-46445 Spectator mode particles and sounds computed from where you have been before
this.field_71424_I.func_76319_b();
this.field_71424_I.func_76320_a("render");
GlStateManager.func_179094_E();
@@ -771,11 +789,13 @@
GlStateManager.func_179098_w();
this.field_71424_I.func_76319_b();
if (!this.field_71454_w) {
+ net.minecraftforge.fml.hooks.BasicEventHooks.onRenderTickStart(this.field_71428_T.field_194147_b);
this.field_71424_I.func_76318_c("gameRenderer");
this.field_71460_t.func_195458_a(this.field_71445_n ? this.field_193996_ah : this.field_71428_T.field_194147_b, i, p_195542_1_);
this.field_71424_I.func_76318_c("toasts");
this.field_193034_aS.func_195625_a();
this.field_71424_I.func_76319_b();
+ net.minecraftforge.fml.hooks.BasicEventHooks.onRenderTickEnd(this.field_71428_T.field_194147_b);
}
this.field_71424_I.func_76319_b();
@@ -994,8 +1014,8 @@
if (this.field_71429_W <= 0 && !this.field_71439_g.func_184587_cr()) {
if (p_147115_1_ && this.field_71476_x != null && this.field_71476_x.field_72313_a == RayTraceResult.Type.BLOCK) {
BlockPos blockpos = this.field_71476_x.func_178782_a();
- if (!this.field_71441_e.func_180495_p(blockpos).func_196958_f() && this.field_71442_b.func_180512_c(blockpos, this.field_71476_x.field_178784_b)) {
- this.field_71452_i.func_180532_a(blockpos, this.field_71476_x.field_178784_b);
+ if (!this.field_71441_e.func_175623_d(blockpos) && this.field_71442_b.func_180512_c(blockpos, this.field_71476_x.field_178784_b)) {
+ this.field_71452_i.addBlockHitEffects(blockpos, this.field_71476_x);
this.field_71439_g.func_184609_a(EnumHand.MAIN_HAND);
}
@@ -1020,7 +1040,7 @@
break;
case BLOCK:
BlockPos blockpos = this.field_71476_x.func_178782_a();
- if (!this.field_71441_e.func_180495_p(blockpos).func_196958_f()) {
+ if (!this.field_71441_e.func_175623_d(blockpos)) {
this.field_71442_b.func_180511_b(blockpos, this.field_71476_x.field_178784_b);
break;
}
@@ -1030,6 +1050,7 @@
}
this.field_71439_g.func_184821_cY();
+ net.minecraftforge.common.ForgeHooks.onEmptyLeftClick(this.field_71439_g);
}
this.field_71439_g.func_184609_a(EnumHand.MAIN_HAND);
@@ -1060,7 +1081,7 @@
break;
case BLOCK:
BlockPos blockpos = this.field_71476_x.func_178782_a();
- if (!this.field_71441_e.func_180495_p(blockpos).func_196958_f()) {
+ if (!this.field_71441_e.func_180495_p(blockpos).isAir(field_71441_e, blockpos)) {
int i = itemstack.func_190916_E();
EnumActionResult enumactionresult = this.field_71442_b.func_187099_a(this.field_71439_g, this.field_71441_e, blockpos, this.field_71476_x.field_178784_b, this.field_71476_x.field_72307_f, enumhand);
if (enumactionresult == EnumActionResult.SUCCESS) {
@@ -1079,6 +1100,9 @@
}
}
+ if (itemstack.func_190926_b() && (this.field_71476_x == null || this.field_71476_x.field_72313_a == RayTraceResult.Type.MISS))
+ net.minecraftforge.common.ForgeHooks.onEmptyClick(this.field_71439_g, enumhand);
+
if (!itemstack.func_190926_b() && this.field_71442_b.func_187101_a(this.field_71439_g, this.field_71441_e, enumhand) == EnumActionResult.SUCCESS) {
this.field_71460_t.field_78516_c.func_187460_a(enumhand);
return;
@@ -1098,6 +1122,8 @@
--this.field_71467_ac;
}
+ net.minecraftforge.fml.hooks.BasicEventHooks.onPreClientTick();
+
this.field_71424_I.func_76320_a("gui");
if (!this.field_71445_n) {
this.field_71456_v.func_73831_a();
@@ -1220,6 +1246,8 @@
this.field_71424_I.func_76318_c("keyboard");
this.field_195559_v.func_204870_b();
this.field_71424_I.func_76319_b();
+
+ net.minecraftforge.fml.hooks.BasicEventHooks.onPostClientTick();
}
private void func_184117_aA() {
@@ -1378,6 +1406,14 @@
guiscreenworking.func_200209_c(new TextComponentString(""));
}
+ if (!net.minecraftforge.fml.StartupQuery.check() || this.field_71437_Z.func_71241_aa()) {
+ this.func_147108_a(null);
+ return;
+ } else {
+ // if we're showing nothing, put the working screen back again
+ if (this.field_71462_r == null)
+ this.func_147108_a(guiscreenworking);
+ }
this.func_195542_b(false);
try {
@@ -1397,7 +1433,12 @@
networkmanager.func_150719_a(new NetHandlerLoginClient(networkmanager, this, (GuiScreen)null, (p_209507_0_) -> {
}));
+ net.minecraftforge.fml.network.NetworkHooks.registerClientLoginChannel(networkmanager);
networkmanager.func_179290_a(new CPacketHandshake(socketaddress.toString(), 0, EnumConnectionState.LOGIN));
networkmanager.func_179290_a(new CPacketLoginStart(this.func_110432_I().func_148256_e()));
- networkmanager.func_179290_a(new CPacketLoginStart(this.func_110432_I().func_148256_e()));
+ com.mojang.authlib.GameProfile gameProfile = this.func_110432_I().func_148256_e();
+ if (!this.func_110432_I().hasCachedProperties()) {
+ gameProfile = field_152355_az.fillProfileProperties(gameProfile, true); //Forge: Fill profile properties upon game load. Fixes MC-52974.
+ this.func_110432_I().setProperties(gameProfile.getProperties());
+ }
+ networkmanager.func_179290_a(new CPacketLoginStart(gameProfile));
this.field_71453_ak = networkmanager;
}
@@ -1411,6 +1452,7 @@
}
public void func_205055_a(@Nullable WorldClient p_205055_1_, GuiScreen p_205055_2_) {
+ if (field_71441_e != null) net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.event.world.WorldEvent.Unload(field_71441_e));
if (p_205055_1_ == null) {
NetHandlerPlayClient nethandlerplayclient = this.func_147114_u();
if (nethandlerplayclient != null) {
@@ -1447,6 +1489,7 @@
}
TileEntityRendererDispatcher.field_147556_a.func_147543_a(p_205055_1_);
+ net.minecraftforge.client.MinecraftForgeClient.clearRenderCache();
if (p_205055_1_ != null) {
if (!this.field_71455_al) {
AuthenticationService authenticationservice = new YggdrasilAuthenticationService(this.field_110453_aa, UUID.randomUUID().toString());
@@ -1493,6 +1536,7 @@
EntityPlayerSP entityplayersp = this.field_71439_g;
this.field_71439_g = this.field_71442_b.func_199681_a(this.field_71441_e, this.field_71439_g == null ? new StatisticsManager() : this.field_71439_g.func_146107_m(), this.field_71439_g == null ? new RecipeBookClient(new RecipeManager()) : this.field_71439_g.func_199507_B());
this.field_71439_g.func_184212_Q().func_187218_a(entityplayersp.func_184212_Q().func_187231_c());
+ this.field_71439_g.updateSyncFields(entityplayersp); // Forge: fix MC-10657
this.field_71439_g.field_71093_bK = p_212315_1_;
this.field_175622_Z = this.field_71439_g;
this.field_71439_g.func_70065_x();
@@ -1532,110 +1576,8 @@
private void func_147112_ai() {
if (this.field_71476_x != null && this.field_71476_x.field_72313_a != RayTraceResult.Type.MISS) {
- boolean flag = this.field_71439_g.field_71075_bZ.field_75098_d;
- TileEntity tileentity = null;
- ItemStack itemstack;
- if (this.field_71476_x.field_72313_a == RayTraceResult.Type.BLOCK) {
- BlockPos blockpos = this.field_71476_x.func_178782_a();
- IBlockState iblockstate = this.field_71441_e.func_180495_p(blockpos);
- Block block = iblockstate.func_177230_c();
- if (iblockstate.func_196958_f()) {
- return;
- }
-
- itemstack = block.func_185473_a(this.field_71441_e, blockpos, iblockstate);
- if (itemstack.func_190926_b()) {
- return;
- }
-
- if (flag && GuiScreen.func_146271_m() && block.func_149716_u()) {
- tileentity = this.field_71441_e.func_175625_s(blockpos);
- }
- } else {
- if (this.field_71476_x.field_72313_a != RayTraceResult.Type.ENTITY || this.field_71476_x.field_72308_g == null || !flag) {
- return;
- }
-
- if (this.field_71476_x.field_72308_g instanceof EntityPainting) {
- itemstack = new ItemStack(Items.field_151159_an);
- } else if (this.field_71476_x.field_72308_g instanceof EntityLeashKnot) {
- itemstack = new ItemStack(Items.field_151058_ca);
- } else if (this.field_71476_x.field_72308_g instanceof EntityItemFrame) {
- EntityItemFrame entityitemframe = (EntityItemFrame)this.field_71476_x.field_72308_g;
- ItemStack itemstack1 = entityitemframe.func_82335_i();
- if (itemstack1.func_190926_b()) {
- itemstack = new ItemStack(Items.field_151160_bD);
- } else {
- itemstack = itemstack1.func_77946_l();
- }
- } else if (this.field_71476_x.field_72308_g instanceof EntityMinecart) {
- EntityMinecart entityminecart = (EntityMinecart)this.field_71476_x.field_72308_g;
- Item item;
- switch(entityminecart.func_184264_v()) {
- case FURNACE:
- item = Items.field_151109_aJ;
- break;
- case CHEST:
- item = Items.field_151108_aI;
- break;
- case TNT:
- item = Items.field_151142_bV;
- break;
- case HOPPER:
- item = Items.field_151140_bW;
- break;
- case COMMAND_BLOCK:
- item = Items.field_151095_cc;
- break;
- default:
- item = Items.field_151143_au;
- }
-
- itemstack = new ItemStack(item);
- } else if (this.field_71476_x.field_72308_g instanceof EntityBoat) {
- itemstack = new ItemStack(((EntityBoat)this.field_71476_x.field_72308_g).func_184455_j());
- } else if (this.field_71476_x.field_72308_g instanceof EntityArmorStand) {
- itemstack = new ItemStack(Items.field_179565_cj);
- } else if (this.field_71476_x.field_72308_g instanceof EntityEnderCrystal) {
- itemstack = new ItemStack(Items.field_185158_cP);
- } else {
- ItemSpawnEgg itemspawnegg = ItemSpawnEgg.func_200889_b(this.field_71476_x.field_72308_g.func_200600_R());
- if (itemspawnegg == null) {
- return;
- }
-
- itemstack = new ItemStack(itemspawnegg);
- }
- }
-
- if (itemstack.func_190926_b()) {
- String s = "";
- if (this.field_71476_x.field_72313_a == RayTraceResult.Type.BLOCK) {
- s = IRegistry.field_212618_g.func_177774_c(this.field_71441_e.func_180495_p(this.field_71476_x.func_178782_a()).func_177230_c()).toString();
- } else if (this.field_71476_x.field_72313_a == RayTraceResult.Type.ENTITY) {
- s = IRegistry.field_212629_r.func_177774_c(this.field_71476_x.field_72308_g.func_200600_R()).toString();
- }
-
- field_147123_G.warn("Picking on: [{}] {} gave null item", this.field_71476_x.field_72313_a, s);
- } else {
- InventoryPlayer inventoryplayer = this.field_71439_g.field_71071_by;
- if (tileentity != null) {
- this.func_184119_a(itemstack, tileentity);
- }
-
- int i = inventoryplayer.func_184429_b(itemstack);
- if (flag) {
- inventoryplayer.func_184434_a(itemstack);
- this.field_71442_b.func_78761_a(this.field_71439_g.func_184586_b(EnumHand.MAIN_HAND), 36 + inventoryplayer.field_70461_c);
- } else if (i != -1) {
- if (InventoryPlayer.func_184435_e(i)) {
- inventoryplayer.field_70461_c = i;
- } else {
- this.field_71442_b.func_187100_a(i);
- }
- }
-
- }
+ net.minecraftforge.common.ForgeHooks.onPickBlock(this.field_71476_x, this.field_71439_g, this.field_71441_e);
+ // We delete this code wholly instead of commenting it out, to make sure we detect changes in it between MC versions
}
}
@@ -1712,6 +1654,7 @@
return field_71432_P;
}
+ @Deprecated // Forge: Use selective scheduleResourceRefresh method in FMLClientHandler
public ListenableFuture<Object> func_175603_A() {
return this.func_152344_a(this::func_110436_a);
}
@@ -1871,6 +1814,8 @@
}
public MusicTicker.MusicType func_147109_W() {
+ MusicTicker.MusicType type = this.field_71441_e == null || this.field_71441_e.field_73011_w == null ? null : this.field_71441_e.field_73011_w.getMusicType();
+ if (type != null) return type;
if (this.field_71462_r instanceof GuiWinGame) {
return MusicTicker.MusicType.CREDITS;
} else if (this.field_71439_g == null) {
@@ -2010,4 +1955,12 @@
public FontResourceManager func_211500_ak() {
return this.field_211501_aD;
}
+
+ public ItemColors getItemColors() {
+ return this.field_184128_aI;
+ }
+
+ public SearchTreeManager getSearchTreeManager() {
+ return this.field_193995_ae;
+ }
}
@@ -0,0 +1,51 @@
--- a/net/minecraft/client/MouseHelper.java
+++ b/net/minecraft/client/MouseHelper.java
@@ -76,11 +76,15 @@
final int pFinal = p_198023_3_;
if (flag) {
GuiScreen.func_195121_a(() -> {
- aboolean[0] = this.field_198036_a.field_71462_r.mouseClicked(d0, d1, pFinal);
+ aboolean[0] = net.minecraftforge.client.ForgeHooksClient.onGuiMouseClickedPre(this.field_198036_a.field_71462_r, d0, d1, pFinal);
+ if (!aboolean[0]) aboolean[0] = this.field_198036_a.field_71462_r.mouseClicked(d0, d1, pFinal);
+ if (!aboolean[0]) aboolean[0] = net.minecraftforge.client.ForgeHooksClient.onGuiMouseClickedPost(this.field_198036_a.field_71462_r, d0, d1, pFinal);
}, "mouseClicked event handler", this.field_198036_a.field_71462_r.getClass().getCanonicalName());
} else {
GuiScreen.func_195121_a(() -> {
- aboolean[0] = this.field_198036_a.field_71462_r.mouseReleased(d0, d1, pFinal);
+ aboolean[0] = net.minecraftforge.client.ForgeHooksClient.onGuiMouseReleasedPre(this.field_198036_a.field_71462_r, d0, d1, pFinal);
+ if (!aboolean[0]) aboolean[0] = this.field_198036_a.field_71462_r.mouseReleased(d0, d1, pFinal);
+ if (!aboolean[0]) aboolean[0] = net.minecraftforge.client.ForgeHooksClient.onGuiMouseReleasedPost(this.field_198036_a.field_71462_r, d0, d1, pFinal);
}, "mouseReleased event handler", this.field_198036_a.field_71462_r.getClass().getCanonicalName());
}
}
@@ -103,7 +107,7 @@
}
}
}
-
+ net.minecraftforge.client.ForgeHooksClient.fireMouseInput(p_198023_3_, p_198023_4_, p_198023_5_);
}
}
@@ -111,7 +115,9 @@
if (p_198020_1_ == Minecraft.func_71410_x().field_195558_d.func_198092_i()) {
double d0 = p_198020_5_ * this.field_198036_a.field_71474_y.field_208033_V;
if (this.field_198036_a.field_71462_r != null) {
- this.field_198036_a.field_71462_r.mouseScrolled(d0);
+ if (net.minecraftforge.client.ForgeHooksClient.onGuiMouseScrollPre(this, this.field_198036_a.field_71462_r, d0)) return;
+ if (this.field_198036_a.field_71462_r.mouseScrolled(d0)) return;
+ net.minecraftforge.client.ForgeHooksClient.onGuiMouseScrollPost(this, this.field_198036_a.field_71462_r, d0);
} else if (this.field_198036_a.field_71439_g != null) {
if (this.field_200542_o != 0.0D && Math.signum(d0) != Math.signum(this.field_200542_o)) {
this.field_200542_o = 0.0D;
@@ -160,7 +166,9 @@
double d2 = (p_198022_3_ - this.field_198040_e) * (double)this.field_198036_a.field_195558_d.func_198107_o() / (double)this.field_198036_a.field_195558_d.func_198105_m();
double d3 = (p_198022_5_ - this.field_198041_f) * (double)this.field_198036_a.field_195558_d.func_198087_p() / (double)this.field_198036_a.field_195558_d.func_198083_n();
GuiScreen.func_195121_a(() -> {
- iguieventlistener.mouseDragged(d0, d1, this.field_198042_g, d2, d3);
+ if (net.minecraftforge.client.ForgeHooksClient.onGuiMouseDragPre(this.field_198036_a.field_71462_r, d0, d1, this.field_198042_g, d2, d3)) return;
+ if (iguieventlistener.mouseDragged(d0, d1, this.field_198042_g, d2, d3)) return;
+ net.minecraftforge.client.ForgeHooksClient.onGuiMouseDragPost(this.field_198036_a.field_71462_r, d0, d1, this.field_198042_g, d2, d3);
}, "mouseDragged event handler", iguieventlistener.getClass().getCanonicalName());
}
@@ -0,0 +1,59 @@
--- a/net/minecraft/client/audio/SoundHandler.java
+++ b/net/minecraft/client/audio/SoundHandler.java
@@ -64,6 +64,7 @@
public void func_195410_a(IResourceManager p_195410_1_) {
this.field_147697_e.clear();
+ java.util.List<net.minecraft.util.Tuple<ResourceLocation, SoundList>> resources = new java.util.LinkedList<>();
for(String s : p_195410_1_.func_199001_a()) {
try {
for(IResource iresource : p_195410_1_.func_199004_b(new ResourceLocation(s, "sounds.json"))) {
@@ -71,7 +72,7 @@
Map<String, SoundList> map = this.func_175085_a(iresource.func_199027_b());
for(Entry<String, SoundList> entry : map.entrySet()) {
- this.func_147693_a(new ResourceLocation(s, entry.getKey()), entry.getValue());
+ resources.add(new net.minecraft.util.Tuple<>(new ResourceLocation(s, entry.getKey()), entry.getValue()));
}
} catch (RuntimeException runtimeexception) {
field_147698_b.warn("Invalid sounds.json in resourcepack: '{}'", iresource.func_199026_d(), runtimeexception);
@@ -81,7 +82,18 @@
;
}
}
+ try (net.minecraftforge.fml.common.progress.ProgressBar resourcesBar = net.minecraftforge.fml.common.progress.StartupProgressManager.start("Loading sounds", resources.size())) {
+ resources.forEach(entry -> {
+ resourcesBar.step(entry.func_76341_a().toString());
+ try {
+ this.func_147693_a(entry.func_76341_a(), entry.func_76340_b());
+ } catch (RuntimeException e) {
+ field_147698_b.warn("Invalid sounds.json", e);
+ }
+ });
+ }; // Forge: end progress bar
+
for(ResourceLocation resourcelocation : this.field_147697_e.keySet()) {
SoundEventAccessor soundeventaccessor = this.field_147697_e.get(resourcelocation);
if (soundeventaccessor.func_188712_c() instanceof TextComponentTranslation) {
@@ -211,6 +223,10 @@
this.field_147694_f.func_148615_a(p_147691_1_, p_147691_2_);
}
+ public void setListener(net.minecraft.entity.Entity entity, float partialTicks) {
+ this.field_147694_f.setListener(entity, partialTicks);
+ }
+
public void func_147689_b() {
this.field_147694_f.func_148610_e();
}
@@ -258,4 +274,9 @@
public void func_195478_a(@Nullable ResourceLocation p_195478_1_, @Nullable SoundCategory p_195478_2_) {
this.field_147694_f.func_195855_a(p_195478_1_, p_195478_2_);
}
+
+ @Override
+ public net.minecraftforge.resource.IResourceType getResourceType() {
+ return net.minecraftforge.resource.VanillaResourceType.SOUNDS;
+ }
}
@@ -0,0 +1,61 @@
--- a/net/minecraft/client/audio/SoundManager.java
+++ b/net/minecraft/client/audio/SoundManager.java
@@ -69,6 +69,7 @@
try {
SoundSystemConfig.addLibrary(LibraryLWJGL3.class);
SoundSystemConfig.setCodec("ogg", CodecJOrbis.class);
+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.sound.SoundSetupEvent(this));
} catch (SoundSystemException soundsystemexception) {
field_148621_b.error(field_148623_a, "Error linking with the LibraryJavaSound plug-in", (Throwable)soundsystemexception);
}
@@ -88,6 +89,7 @@
this.func_148613_b();
this.func_148608_i();
+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.sound.SoundLoadEvent(this));
}
private synchronized void func_148608_i() {
@@ -293,6 +295,8 @@
public void func_148611_c(ISound p_148611_1_) {
if (this.field_148617_f) {
+ p_148611_1_ = net.minecraftforge.client.ForgeHooksClient.playSound(this, p_148611_1_);
+ if (p_148611_1_ == null) return;
SoundEventAccessor soundeventaccessor = p_148611_1_.func_184366_a(this.field_148622_c);
ResourceLocation resourcelocation = p_148611_1_.func_147650_b();
if (soundeventaccessor == null) {
@@ -334,8 +338,10 @@
ResourceLocation resourcelocation1 = sound.func_188721_b();
if (sound.func_188723_h()) {
this.field_148620_e.newStreamingSource(p_148611_1_.func_204200_l(), s, func_148612_a(resourcelocation1), resourcelocation1.toString(), flag, p_148611_1_.func_147649_g(), p_148611_1_.func_147654_h(), p_148611_1_.func_147651_i(), p_148611_1_.func_147656_j().func_148586_a(), f);
+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.sound.PlayStreamingSourceEvent(this, p_148611_1_, s));
} else {
this.field_148620_e.newSource(p_148611_1_.func_204200_l(), s, func_148612_a(resourcelocation1), resourcelocation1.toString(), flag, p_148611_1_.func_147649_g(), p_148611_1_.func_147654_h(), p_148611_1_.func_147651_i(), p_148611_1_.func_147656_j().func_148586_a(), f);
+ net.minecraftforge.common.MinecraftForge.EVENT_BUS.post(new net.minecraftforge.client.event.sound.PlaySoundSourceEvent(this, p_148611_1_, s));
}
field_148621_b.debug(field_148623_a, "Playing sound {} for event {} as channel {}", sound.func_188719_a(), resourcelocation, s);
@@ -423,12 +429,16 @@
}
public void func_148615_a(EntityPlayer p_148615_1_, float p_148615_2_) {
- if (this.field_148617_f && p_148615_1_ != null) {
- float f = p_148615_1_.field_70127_C + (p_148615_1_.field_70125_A - p_148615_1_.field_70127_C) * p_148615_2_;
- float f1 = p_148615_1_.field_70126_B + (p_148615_1_.field_70177_z - p_148615_1_.field_70126_B) * p_148615_2_;
- double d0 = p_148615_1_.field_70169_q + (p_148615_1_.field_70165_t - p_148615_1_.field_70169_q) * (double)p_148615_2_;
- double d1 = p_148615_1_.field_70167_r + (p_148615_1_.field_70163_u - p_148615_1_.field_70167_r) * (double)p_148615_2_ + (double)p_148615_1_.func_70047_e();
- double d2 = p_148615_1_.field_70166_s + (p_148615_1_.field_70161_v - p_148615_1_.field_70166_s) * (double)p_148615_2_;
+ setListener((net.minecraft.entity.Entity)p_148615_1_, p_148615_2_);
+ }
+
+ public void setListener(net.minecraft.entity.Entity player, float partialTicks) {
+ if (this.field_148617_f && player != null) {
+ float f = player.field_70127_C + (player.field_70125_A - player.field_70127_C) * partialTicks;
+ float f1 = player.field_70126_B + (player.field_70177_z - player.field_70126_B) * partialTicks;
+ double d0 = player.field_70169_q + (player.field_70165_t - player.field_70169_q) * (double)partialTicks;
+ double d1 = player.field_70167_r + (player.field_70163_u - player.field_70167_r) * (double)partialTicks + (double)player.func_70047_e();
+ double d2 = player.field_70166_s + (player.field_70161_v - player.field_70166_s) * (double)partialTicks;
float f2 = MathHelper.func_76134_b((f1 + 90.0F) * ((float)Math.PI / 180F));
float f3 = MathHelper.func_76126_a((f1 + 90.0F) * ((float)Math.PI / 180F));
float f4 = MathHelper.func_76134_b(-f * ((float)Math.PI / 180F));
@@ -0,0 +1,19 @@
--- a/net/minecraft/client/entity/AbstractClientPlayer.java
+++ b/net/minecraft/client/entity/AbstractClientPlayer.java
@@ -114,7 +114,7 @@
f = 1.0F;
}
- if (this.func_184587_cr() && this.func_184607_cu().func_77973_b() == Items.field_151031_f) {
+ if (this.func_184587_cr() && this.func_184607_cu().func_77973_b() instanceof net.minecraft.item.ItemBow) {
int i = this.func_184612_cw();
float f1 = (float)i / 20.0F;
if (f1 > 1.0F) {
@@ -126,6 +126,6 @@
f *= 1.0F - f1 * 0.15F;
}
- return f;
+ return net.minecraftforge.client.ForgeHooksClient.getOffsetFOV(this, f);
}
}
@@ -0,0 +1,10 @@
--- a/net/minecraft/client/entity/EntityOtherPlayerMP.java
+++ b/net/minecraft/client/entity/EntityOtherPlayerMP.java
@@ -29,6 +29,7 @@
}
public boolean func_70097_a(DamageSource p_70097_1_, float p_70097_2_) {
+ net.minecraftforge.common.ForgeHooks.onPlayerAttack(this, p_70097_1_, p_70097_2_);
return true;
}
Loaded 100 of 1386 files, more files were not shown because too many files have changed in this diff. Show more