974 Commits
Author SHA1 Message Date
chylex e98228d280 Add HEE.DIM constant with End dimension ID 2019-12-16 04:46:53 +01:00
chylex 0be16c62e8 Add Autumn Leaves & Saplings w/ tree generation 2019-12-16 01:22:59 +01:00
chylex 2fb8402c17 Add Whitebark Leaves & Sapling classes w/ growth behavior 2019-12-15 22:23:25 +01:00
chylex f7a1ef21e7 Update BlobGenerator & IOreTechnique to use and consider ScaffoldedWorld 2019-12-15 19:21:06 +01:00
chylex c1834f4a3f Add ScaffoldedWorld for small partial structures 2019-12-15 19:21:05 +01:00
chylex 96ef5716dc Implement Ender Causatum event for killing an Enderman 2019-12-14 01:12:02 +01:00
chylex 2680dc47cd Fix instant rotation still interpolating yaw offset in living entities 2019-12-14 00:45:43 +01:00
chylex 403834b984 Add technical entity for managing Ender Causatum events 2019-12-14 00:19:07 +01:00
chylex 08a14fddab Implement Ender Causatum stage triggers for entered territories 2019-12-13 18:27:53 +01:00
chylex 291a61162e Add Angry Enderman & tweak rendering of aggressive Endermen 2019-12-13 17:50:59 +01:00
chylex 830cb39f24 Fix instant TP still causing interpolation & add comment about mob rotation 2019-12-13 17:46:39 +01:00
chylex ae1e8bc0e4 Implement Table dust handling & rendering 2019-12-13 01:20:00 +01:00
chylex 6306e4c7a1 Move common item model rendering code into a utility class 2019-12-12 23:12:25 +01:00
chylex 730958f80d Add Miner's Burial Altar w/ animations and redeem sequence 2019-12-12 18:18:11 +01:00
chylex 7510e08a8f Allow constructing empty MutableWeightedList & combining two lists 2019-12-12 17:09:23 +01:00
chylex 42c38eae61 Delay debug window maximization until game finishes loading 2019-12-11 21:51:07 +01:00
chylex 2884fb2e79 Increase Energy draining rate for items & improve particles w/ reduced setting 2019-12-11 21:16:04 +01:00
chylex 5819d7a3bc Fix setAttackTarget (use event result in Spiderling, document Enderman weirdness) 2019-12-11 20:39:35 +01:00
chylex 7e9d3946cc Time territory generation 2019-12-11 20:32:37 +01:00
chylex 0d1ed428db Fix Spatial Dash Gem texture & expire FX (long distance audio, wrong instant tp pos) 2019-12-11 20:01:56 +01:00
chylex 568259d519 Add Miner's Burial Blocks 2019-12-11 19:19:34 +01:00
chylex 6d8a7108d1 Implement craftable Void Portal blocks & make them usable outside the End 2019-12-10 19:27:47 +01:00
chylex 5fd414cd4b Add custom crafting recipe ingredient types (full Energy, no Infusions) 2019-12-10 16:19:02 +01:00
chylex 5801bc1f3a Add WIP Linking Gem (only item definition and texture) 2019-12-10 15:23:32 +01:00
chylex 771009478d Add WIP Vampire Bat (basic behavior, movement, assets) 2019-12-10 13:20:47 +01:00
chylex d59ec71935 Change IDamageProcessor.STATUS to take a function instead of constant status effect 2019-12-10 11:40:02 +01:00
chylex dd36b0cd30 Add custom entity knockback multiplier 2019-11-17 14:48:47 +01:00
chylex 8d0b38fc96 Add Experience Gate w/ behavior and rendering 2019-11-07 03:16:09 +01:00
chylex e75c868a34 Add particle effect of floating experience orb 2019-11-07 02:08:46 +01:00
chylex a2e971f4e3 Fix Token Holder (rotation stutter, creative mode, placement) & add break particles 2019-10-29 09:27:35 +01:00
chylex 170383b133 Update custom smoke particle to allow setting a custom lifespan 2019-10-27 18:03:11 +01:00
chylex af2b5b30a8 Add packet to update client-side experience points 2019-10-27 18:03:10 +01:00
chylex 11c82ecfd3 Refactor particle system 2019-10-26 14:07:28 +02:00
chylex 17af8f495a Reorganize tile entities & minor fix in BlockBuilders and PosExt 2019-10-26 07:29:21 +02:00
chylex b337510a6e Fix Obsidian Tower room spawning Redstone on top of a ladder 2019-10-26 04:59:40 +02:00
chylex ed1d2f8262 Implement Arcane Conjunctions blob contents & Energy Cluster generation 2019-10-16 18:40:50 +02:00
chylex 6915d4a14e Remove unused code & minor refactoring 2019-10-16 17:08:44 +02:00
chylex f0ce92a9f4 Refactor BlockPuzzleLogic to use the new flood-fill extension 2019-10-16 16:01:52 +02:00
chylex b92e64b743 Add BlockUpdateStructureTrigger to update blocks after generation 2019-10-16 16:00:50 +02:00
chylex d82dc043a0 Add flood-fill as a BlockPos extension 2019-10-16 15:48:04 +02:00
chylex bc64a6e4f3 Fix typo in TileEntitySpawnerObsidianTower & refactor activation check 2019-10-16 14:09:10 +02:00
chylex ed89c0dc03 Work on Arcane Conjunctions territory (all worldgen except for Blob content) 2019-10-15 18:07:11 +02:00
chylex ff394e7ff8 Refactor IStructureTrigger to place blocks into the world immediately 2019-10-15 17:43:46 +02:00
chylex 22a267adba Add BlobPopulatorFill & BlobPopulatorOre 2019-10-15 15:15:59 +02:00
chylex d2caa9d7d4 Fix wrong ore count in OreTechniqueDistance & add attemptMultiplier parameter 2019-10-13 11:45:33 +02:00
chylex 72b377349c Tweak IBlockPlacer to only return true on block change & add documentation 2019-10-13 11:44:53 +02:00
chylex b04a27e80c Hide unwanted vanilla/forge imports in IntelliJ 2019-10-12 16:30:08 +02:00
chylex 268572c87c Fix using vanilla imports instead of migration ones & optimize imports 2019-10-12 16:30:08 +02:00
chylex 3a00a6fc59 Add missing markDirty calls to TileEntityIgneousPlate 2019-10-12 14:27:10 +02:00
chylex 31ea9f2bd7 Refactor code (fewer Sequences and classes, inefficient collection use) 2019-10-12 14:14:14 +02:00
chylex a2f14d8c39 Add Iterator.any & Iterator.find extensions 2019-10-12 14:07:47 +02:00
chylex 2eeb1f13ae Move NBT key string literals into constants 2019-10-12 11:50:43 +02:00
chylex bb1301b1fb Fix imports (TileEntityBaseSpawner) and refactor proxy use in ItemAbstractTrinket 2019-10-12 11:47:52 +02:00
chylex 9a0930da65 Refactor Grave Dirt to not use block states for variations 2019-10-12 09:31:06 +02:00
chylex 40b843f189 Add Obsidian Towers Spawner block & implement its structure trigger 2019-10-12 08:58:18 +02:00
chylex 114a35acb8 Add custom spell particle 2019-10-12 07:33:29 +02:00
chylex c8c6a0b4ee Add PotionEffect.clone extension & fix IDamageProcessor.STATUS 2019-10-12 07:33:29 +02:00
chylex 9720f029f4 Add base classes for custom spawners 2019-10-12 07:33:28 +02:00
chylex 2efbc2e545 Remove configuration file code 2019-10-10 07:41:16 +02:00
chylex 7553c170f3 Remove dependencies (java.awt, FMLCommonHandler, SidedProxy) 2019-10-10 07:40:06 +02:00
chylex 308fedbb73 Fix dedicated server crash caused by SlotTrinketItem 2019-10-10 06:26:35 +02:00
chylex 1b3e4c9215 Add workaround for no light updates after worldgen in the End 2019-10-10 05:49:34 +02:00
chylex 940035a6d8 Add Puzzle Block (assets, variations, Igneous Rock & puzzle behavior) 2019-10-10 05:45:08 +02:00
chylex c46ea188dd Add FacingX.fromDirection(vec) 2019-10-08 02:28:55 +02:00
chylex 28bc4d4a3b Fix duplicate effect in ObsidianTowerSpawnerLevel 2019-10-08 01:17:44 +02:00
chylex 3a48005f76 Add type aliases (MobEffects & PotionTypes), add and use Potion.makeEffect 2019-10-08 01:17:43 +02:00
chylex d8ff161a2b Split FacingExt into individual files and move them to facade package 2019-10-07 23:00:28 +02:00
chylex 7242ba5664 Refactor Resource and move it into facades package 2019-10-07 23:00:13 +02:00
chylex dabd21456c Add facade for StatList & update existing code to use it 2019-10-07 23:00:13 +02:00
chylex 44d423af12 Add type aliases for Blocks, Items, SoundEvents 2019-10-07 11:24:06 +02:00
chylex d2a8717c4b Add method renames (world time, entity attributes) 2019-10-07 11:07:53 +02:00
chylex 2d1b12d6c4 Stop relying on NBT imports 2019-10-07 09:36:55 +02:00
chylex fd0eb2b5f7 Stop relying on FML imports (sides & events) 2019-10-07 08:48:27 +02:00
chylex 6b9253fdf6 Add custom HSB color conversion & destructuring methods to IntColor 2019-10-07 07:07:54 +02:00
chylex f90322129b Stop relying on enum imports (Facing, Difficulty, Hand, ActionResult) 2019-10-02 20:26:23 +02:00
chylex e9da6142d7 Completely remove dependency on GlStateManager 2019-10-02 19:20:05 +02:00
chylex af93df468e Update IBlockColor/IItemColor usages to use the new utilities 2019-10-02 12:03:40 +02:00
chylex 940e62552b Add HSB & IBlockColor/IItemColor utilities 2019-10-02 12:02:16 +02:00
chylex 4f6b14b237 Implement missing Igneous Rock transformations & stack size reduction 2019-09-21 10:03:44 +02:00
chylex 97618e8062 Allow ignoring Trap infusion on TNT & disable Infused TNT flammability 2019-09-21 09:24:49 +02:00
chylex 0c690c4256 Remove TODO in Dispenser behavior for Enderman Heads 2019-09-21 06:39:11 +02:00
chylex f0e4d60777 Add Dispenser support for extinguishing Igneous Plates 2019-09-21 06:31:17 +02:00
chylex 0471d37116 Move Dispenser behavior into a separate package 2019-09-21 06:25:54 +02:00
chylex 08dffde749 Hide Brewing Stand potion slot icons when not empty 2019-09-21 04:39:12 +02:00
chylex 123477b5c5 Add MagicValues for game constants & address a few UPDATE comments 2019-09-21 03:59:31 +02:00
chylex 9ee675be54 Work on Obsidian Tower (loot, rooms, arrangements, token & boss spawning) 2019-09-21 03:57:59 +02:00
chylex 145526a2c5 Log error in LootChestStructureTrigger if applied to invalid tile entity 2019-09-16 19:27:20 +02:00
chylex 7f80f1c6fb Add loot function for picking music disks 2019-09-15 18:44:16 +02:00
chylex 284d9f73e7 Update existing structure palettes to use combo mappings 2019-09-13 22:08:16 +02:00
chylex 6935025004 Add trapdoors to PaletteMappings & define mapping combos for convenience 2019-09-13 21:57:45 +02:00
chylex 9adec4b366 Address IntelliJ code inspection issues 2019-09-10 12:30:29 +02:00
chylex 0f9277b943 Include IntelliJ inspection profile in the repo 2019-09-10 12:27:04 +02:00
chylex 05e67088d5 Add WIP Ender Eye (model, texture, spawn animation & basic behavior) 2019-09-10 09:46:18 +02:00
chylex f816d9076e Update entity code to use Vec3d.directionTowards 2019-09-09 02:37:07 +02:00
chylex f7cebdd2a3 Move Enderman handler classes to a different package 2019-09-08 04:03:26 +02:00
chylex fd741287e5 Ignore setAttackTarget in custom entities when called repeatedly 2019-09-07 10:41:59 +02:00
chylex eaed8e9485 Update EntityMoveFlyingForward to use FLYING_SPEED & add friction constant 2019-09-07 10:05:42 +02:00
chylex e3a59a3ffe Make ModelBox.quadList public and non-final 2019-09-07 10:03:07 +02:00
chylex 0934892eca Refactor EntitySelector to return a List instead of Sequence 2019-09-07 05:37:20 +02:00
chylex 8908293709 Add Entity helpers (instant yaw rotation, direct flight, look slerp) 2019-09-07 04:12:45 +02:00
chylex edc5b5e51d Make Float.toDegrees/toRadians return a Float 2019-09-04 20:27:57 +02:00
chylex 7957de6e2b Add Quaternion class & Vec3d.toPitch extension 2019-09-04 18:29:11 +02:00
chylex ddc9198621 Minor model code refactoring (Token Holder & Amulet of Recovery) 2019-09-04 18:24:16 +02:00
chylex d5658f5532 Make custom creature types public, fix Enderman & Endermite classification 2019-09-03 03:26:38 +02:00
chylex e489576321 Add WIP Igneous Plate (assets, visuals, recipe, smelting speed behavior) 2019-09-02 04:54:02 +02:00
chylex dd8f74cb61 Add model extensions & builder for cubes 2019-08-29 14:33:32 +02:00
chylex 5c7a21a876 Add Property.facing to construct PropertyDirection 2019-08-17 01:51:35 +02:00
chylex 28c9e8d074 Rename SlotReadOnly to SlotTakeOnly 2019-08-16 23:21:28 +02:00
chylex dedae0695b Allow opening Shulker Boxes without placing them down 2019-08-16 21:31:47 +02:00
chylex 8bdb13519a Add IInventoryFromPlayerItem to reduce duplicate code & update existing containers 2019-08-16 21:31:46 +02:00
chylex b17bd3434c Implement Spiderling variation of Grave Dirt 2019-08-16 02:01:05 +02:00
chylex 7dfb8c3467 Add Spiderling w/ behavior, rendering, drops 2019-08-16 02:01:05 +02:00
chylex 211c76bcbb Work on AI (wandering, light startle, on-fire panic, leap attack) 2019-08-16 01:45:42 +02:00
chylex e5ac7156ff Implement entity ground navigator that doesn't require a proper path 2019-08-15 02:00:43 +02:00
chylex 784a544c10 Update AIToggle to support multiple tasks at once 2019-08-14 14:23:10 +02:00
chylex b98c263985 Add IAttributeInstance.tryRemoveModifier & update existing code to use it 2019-08-14 14:20:20 +02:00
chylex 83487046be Add dummy definitions & language keys for Phase 2 territories 2019-08-10 22:02:05 +02:00
chylex b25c38cb8f Rework Blob generation and populator picking 2019-08-10 17:35:58 +02:00
chylex 56c88eca52 Fix Blob generator being off-center & wrong edge distance in The Hub 2019-08-10 16:25:28 +02:00
chylex f324e52daf Replace lambdas generating random numbers with RandomInt/RandomDouble 2019-08-09 22:34:19 +02:00
chylex 9529eceaf9 Add RandomInt & RandomDouble implementing (Random) -> R 2019-08-09 22:34:18 +02:00
chylex d6f6923636 Remove ColorSpaces & refactor code to use new color classes 2019-08-09 16:54:02 +02:00
chylex 9e0d1b2526 Add IRandomColor 2019-08-09 16:54:01 +02:00
chylex eae7b7027f Add IntColor as inline class for RGB w/ HCL support 2019-08-09 16:54:01 +02:00
chylex b8a163effc Add EnvironmentRenderer constant w/ vanilla skycube parameters 2019-08-09 11:49:58 +02:00
chylex 9619760a53 Fix server startup crash due to EnvironmentRenderer 2019-08-09 11:19:00 +02:00
chylex 093fba8138 Add Portal Token to each territory to creative tab 2019-08-08 21:50:51 +02:00
chylex 3e1ac61f10 Remember spawn location of the first entity to travel through Void Portal 2019-08-08 17:09:23 +02:00
chylex a2fa112c20 Hide block outlines for portal blocks 2019-08-08 15:32:29 +02:00
chylex 7a8a930cfa Tweak portal animations & implement slowing before fade-out 2019-08-08 15:32:29 +02:00
chylex 3605ec7935 Implement Void Portals remembering last used portal 2019-08-08 12:55:19 +02:00
chylex 04840002c7 Implement portal clearance & refactor 2019-08-08 10:28:32 +02:00
chylex f7599abb83 Add Purity Extract & Potion of Purity 2019-08-07 17:52:10 +02:00
chylex fb397f9ba5 Add PotionBase.makeType to simplify PotionType registering 2019-08-07 17:50:35 +02:00
chylex bab34fd36f Fix several issues with Potions (typos in recipes, compatibility with old worlds) 2019-08-07 17:28:57 +02:00
chylex 005e467373 Add IForgeRegistry.getIfExists extension to avoid defaults 2019-08-07 15:53:55 +02:00
chylex 5b238ef770 Implement Dragon's Breath recipe using a Cauldron 2019-08-06 21:26:19 +02:00
chylex fa15245cff Refactor custom Cauldrons to make bucket & bottle handling easier 2019-08-06 18:53:42 +02:00
chylex 03a8b5d656 Add TODOs about overridden entities and potions 2019-08-06 18:27:35 +02:00
chylex 07ef703929 Add custom item entity for Cauldron recipes & change pickup behavior for items in Cauldrons 2019-08-06 18:27:35 +02:00
chylex 93f1f627ea Add custom bubble particle that works outside water 2019-08-06 17:56:47 +02:00
chylex 2ee8b75c38 Remove unnecessary JvmStatic and JvmField annotations 2019-08-06 16:51:08 +02:00
chylex 33e924c2b6 Add Ender Goo Cauldron (w/ Purified variation) 2019-08-05 20:27:40 +02:00
chylex bb35f183a4 Add system for custom cauldrons 2019-08-05 19:15:16 +02:00
chylex a1db944a59 Fix wrong Dragon's Breath brewing recipe & Brewing Stand shift-click slot order 2019-08-05 15:00:11 +02:00
chylex d7e6446fc6 Organize storage blocks into one category in code 2019-08-05 11:04:46 +02:00
chylex f01b51c91a Rebalance Energy Oracle, fix visual glitches, implement Cluster ignoring 2019-08-04 18:15:12 +02:00
chylex a3d74538e2 Add BlockPos.closestTickingTile w/ predicate & remove maxDistance default 2019-08-04 16:41:37 +02:00
chylex aad4102dea Add potted Withered Death Flowers into Energy Shrines 2019-08-04 12:45:41 +02:00
chylex 7ce4d1ef51 Implement Flower Pots with Death Flowers & fix Endermen not spawning 2019-08-04 12:14:18 +02:00
chylex b2dd48d8c3 Add system for custom flower pots 2019-08-04 11:12:43 +02:00
chylex 8799b7370d Fix useNeighborBrightness & ambient occlusion on existing blocks 2019-08-03 17:28:52 +02:00
chylex 7063797809 Update solid top checks in BlockEternalFire & BlockJarODust 2019-08-03 17:28:52 +02:00
chylex c87f2605d5 Add BlockPos.isTopSolid extension & remove a few inlines 2019-08-03 17:28:52 +02:00
chylex 074bceb5b2 Update & refactor a few things to address TODOs 2019-08-03 17:28:51 +02:00
chylex 5d2e781a96 Disable Forge worldgen hook in the End dimension 2019-08-02 19:01:54 +02:00
chylex 4d22626cb6 Make instability-spawned Endermites not despawn on peaceful 2019-08-02 18:18:49 +02:00
chylex 989bc6b712 Add mechanism to prevent hostile mob despawning on peaceful 2019-08-02 18:18:49 +02:00
chylex b8538771f1 Address IDE inspections 2019-08-02 18:18:05 +02:00
chylex 43fa25ace3 Replace Chorus Flower override with a transformer 2019-08-02 18:18:05 +02:00
chylex efb295e343 Add coremod & utilities 2019-08-02 18:18:04 +02:00
chylex 4660c0e788 Add Enhanced Brewing Stand w/ textures and custom behavior 2019-08-02 10:19:32 +02:00
chylex 9ee9876a94 Fix being unable to put potions back into Brewing Stands & modifier issues 2019-08-02 10:12:37 +02:00
chylex 79216ee6d2 Replace vanilla Brewing Stand & implement custom modifiers 2019-08-01 17:12:26 +02:00
chylex f1b0f036fe Move ContainerBaseCustomInventory shift-click logic into an interface 2019-08-01 14:14:14 +02:00
chylex 4395ad412f Separate potion modifier recipes & refactor 2019-08-01 14:06:43 +02:00
chylex 482c5f7153 Change IntelliJ module names because ??? 2019-08-01 04:01:26 +02:00
chylex bb32552fda Completely rework vanilla brewing recipes 2019-07-31 17:02:15 +02:00
chylex d4e43614a2 Disable Kotlin assertions 2019-07-31 02:36:05 +02:00
chylex 6564bc7564 Reduce compiler warnings and inlining 2019-07-31 02:36:05 +02:00
chylex a501bc52b0 Add Obsidian Towers territory w/ basic features 2019-07-30 11:38:19 +02:00
chylex 860dbe6c70 Update existing code to use new BlockPos extensions 2019-07-29 04:13:04 +02:00
chylex a5002c4a26 Add BlockPos extensions for iterating spheres & overloads 2019-07-29 03:53:25 +02:00
chylex 7594de630d Make OreGenerator return the amount of successfully generated clusters 2019-07-28 18:02:03 +02:00
chylex 6fcf9d5e57 Add Random extensions for Kotlin ranges & update existing code to use them 2019-07-26 13:19:12 +02:00
chylex 2770dc36b7 Add StructurePiece.Instance context & use it for Energy Shrine pieces 2019-07-23 15:58:45 +02:00
chylex 155145fe24 Add tile entity utilities to ItemEndermanHead 2019-07-23 12:44:09 +02:00
chylex effff77191 Add WIP Obsidian Tower structure w/ basic layout 2019-07-22 13:08:09 +02:00
chylex 4e0be09711 Allow StructureBuild to add detached pieces 2019-07-21 14:09:00 +02:00
chylex 1555f9796d Fix Void Bucket removing non-fluid blocks in 3x3x3 mode 2019-07-21 13:55:02 +02:00
chylex 2caeb40e55 Refactor code to reduce inner class count 2019-07-21 13:37:02 +02:00
chylex ce07fc3c78 Slightly darken territory title shadow color 2019-07-20 09:03:54 +02:00
chylex 26c169c02e Implement Tomb Dungeon entrance generation in Forgotten Tombs 2019-07-19 12:16:41 +02:00
chylex ebe984eb3b Begin work on Tomb Dungeon 2019-07-19 12:13:28 +02:00
chylex 8463037663 Update Forgotten Tombs environment (skylight, custom lightmap, fog tweaks) 2019-07-19 11:52:45 +02:00
chylex 6f1b12109c Refactor EntityTokenHolder constructors 2019-07-19 08:55:16 +02:00
chylex 78e0010990 Refactor entity structure triggers to allow nudging by fractional x/z amounts 2019-07-18 15:47:24 +02:00
chylex 6349b8564f Add proper FX to Spatial Dash Gem projectile 2019-07-18 05:47:41 +02:00
chylex a5d00e1ecf Fix default smoke color regression & allow random smoke colors 2019-07-18 05:08:04 +02:00
chylex 9532b2d3ce Add subtitles to custom sounds & fix sound import in EntityItemIgneousRock 2019-07-18 03:44:34 +02:00
chylex 7cf058f3c8 Add Blank Token w/ crafting and duplication recipes & update Portal Token texture 2019-07-17 04:25:07 +02:00
chylex aa3ba4ce74 Fix Portal Token crash when activating from player inventory & tweak tooltips 2019-07-17 02:39:08 +02:00
chylex 25a2a23051 Allow ParticleFadingSpot to have a random color 2019-07-16 09:39:50 +02:00
chylex 9cfd1790e2 Add texture for Spatial Dash Gem & source file for future Gems 2019-07-16 08:13:28 +02:00
chylex 3e2e18f19b Change Energy Shrine corridor ceilings to Gloomrock Bricks 2019-07-16 01:36:14 +02:00
chylex 3b5a9ed4df Fix Energy Shrine stair bugs (torch placement, 180° piece misalignments) 2019-07-16 01:20:44 +02:00
chylex 4b3f91bca5 Enable End skylight & custom lightmap handling 2019-07-15 05:16:54 +02:00
chylex 3e8d18b6a4 Fix filecopy.ps1 execution to support PowerShell 2 2019-07-13 17:20:01 +02:00
chylex 46cbd87194 Fix naming of Revitalization Substance sound fields 2019-07-07 17:57:45 +02:00
chylex 484866d8a9 Add Undread w/ behavior, rendering, sounds, and drops 2019-07-07 17:01:36 +02:00
chylex 03185ec29e Add customizable wander AI distance & simplify AITargetNearby 2019-07-06 22:47:48 +02:00
chylex e1961be29b Address IDE inspections & fix damage processor order in EntityMobEnderman 2019-07-06 14:40:25 +02:00
chylex 430893b964 Move trinket classes to a different package 2019-07-06 09:01:40 +02:00
chylex f91bbc22b0 Add Scorching Sword w/ recipe and special hit logic 2019-07-06 08:54:12 +02:00
chylex de015c1f12 Refactor Block building & reorganize Block and Item setup 2019-06-24 17:13:30 +02:00
chylex b01a5eeb86 Refactor Scorching tool code in preparation for Scorching Sword 2019-06-24 14:10:14 +02:00
chylex f1585fffec Implement Ender Goo purification & Revitalization Substance stack limit 2019-06-24 01:13:33 +02:00
chylex f24cf081b7 Add Purified Ender Goo w/ textures, custom behavior, and custom bucket 2019-06-23 17:17:10 +02:00
chylex d9f2cd1dbe Add packet to update client's potion duration 2019-06-23 17:13:06 +02:00
chylex 491e2d9935 Allow custom smoke particle color 2019-06-23 16:15:34 +02:00
chylex 92a6a8a0f8 Refactor Goo (remove capability & fix item aging when touching multiple blocks) 2019-06-22 21:03:48 +02:00
chylex 58200d1b01 Implement Energy Cluster revitalization mechanic w/ FX 2019-06-22 18:16:00 +02:00
chylex 21b14b610b Add ParticleBase.interpolateAge & update ParticleEnergyCluster to use it 2019-06-22 18:15:59 +02:00
chylex 368152fd09 Extract player hand position getter from ParticleEnergyTransferToPlayer 2019-06-21 20:39:51 +02:00
chylex a58550726b Update existing code to use the new Vec3d extension 2019-06-21 18:22:54 +02:00
chylex f4f883f731 Add Vec3d.directionTowards extension 2019-06-21 18:21:36 +02:00
chylex d4dd22e5b8 Implement territory detection in Energy Receptacle 2019-06-21 16:16:49 +02:00
chylex d362f1516a Address a few TODOs (Kotlin features, Block.translationKey, unnecessary TODOs) 2019-06-21 14:07:34 +02:00
chylex 971d91d83c Add WIP Revitalization Substance (texture & recipe) 2019-06-20 11:39:07 +02:00
chylex 02eb09edb9 Fix worldgen Energy Clusters not being marked as inactive 2019-06-20 10:39:58 +02:00
chylex 5ee618988b Remove unnecessary event registrations 2019-06-20 07:59:59 +02:00
chylex a2424fa904 Update Kotlin to 1.3.40 2019-06-20 05:47:57 +02:00
chylex 4fea9793ec Add Flint and Infernium w/ recipe and special TNT & Creeper behavior 2019-06-19 18:31:13 +02:00
chylex 35a35968ef Add Eternal Fire 2019-06-19 13:28:35 +02:00
chylex 5b51adb612 Generate territory's default block inside the surrounding void area 2019-06-13 05:02:13 +02:00
chylex 9ac23a0cdf Work on Forgotten Tombs territory (entrance cave generation & WIP environment) 2019-06-11 20:39:53 +02:00
chylex 0f0ac01a9d Update generators (fix out of bounds in Blobs & The Hub, validate Ore gen chunk size) 2019-06-09 23:07:01 +02:00
chylex 7523063bb8 Fix territory title sometimes showing before the world loads 2019-06-09 23:00:08 +02:00
chylex 157d7c6b7d Add debug toggle for territory void & fog 2019-06-09 19:43:16 +02:00
chylex 15bade1f9a Add debug-only client command for toggles 2019-06-09 19:21:30 +02:00
chylex 2c75ea6c3b Implement structure mirroring 2019-06-09 16:10:44 +02:00
chylex 4fb51c7fe1 Add Grave Dirt w/ texture, drops, and WIP variations 2019-06-08 20:26:47 +02:00
chylex 886b266051 Add loot pool roll type that uses Random.nextRounded on the generated float 2019-06-08 16:01:37 +02:00
chylex 50d6f959f4 Tweak biased loot pool roll definition 2019-06-08 15:58:50 +02:00
chylex 8181f1f366 Make Jar o' Dust require a block with solid top under it 2019-06-08 11:02:55 +02:00
chylex 19c8f9abda Update existing structure code to use updated connection placement code 2019-06-07 23:29:12 +02:00
chylex 578d8688db Move structure connection placement to IStructurePieceConnectionType 2019-06-07 23:28:33 +02:00
chylex 98da56e4ad Fix missing block registration for Whitebark & Dusty Stone Brick double slabs 2019-06-07 19:35:11 +02:00
chylex 40df1eeb5f Add Dusty Stone Brick Stairs & Slab 2019-06-07 17:45:06 +02:00
chylex a1742d3a63 Update existing structure code to use the new connection system 2019-06-07 17:18:52 +02:00
chylex 4a22839a10 Refactor structure piece connection definition 2019-06-07 17:15:06 +02:00
chylex e9d50e5cdf Replace vanilla recipes instead of removing to stop advancement error spam 2019-06-07 12:16:15 +02:00
chylex 9bc8be9f6c Update existing structure code to use the new interfaces 2019-06-06 16:53:58 +02:00
chylex 768e117595 Redo interfaces for structure pieces to reduce code duplication 2019-06-06 16:52:22 +02:00
chylex b4a18fcc86 Fix IStructureWorld.placeWalls bug, add IBlockPicker constructor & null structure locator 2019-06-06 15:24:49 +02:00
chylex 68823d9036 Add rotation argument to '/hee structure piecesdev' command 2019-06-06 15:23:21 +02:00
chylex 504a39b0c3 Add territory environment client ticking & void center offset 2019-06-05 10:25:29 +02:00
chylex f7d09c17ab Add void factor into debug overlay instead of logging to console 2019-06-05 10:18:07 +02:00
chylex 592663ea6e Rewrite portal teleportation cooldown to fix relog & double dip bugs
(i.e. instant teleport after relogging, and no teleport after first
teleporting outside a portal)
2019-06-04 20:46:41 +02:00
chylex 5184a4dcbd Tweak Portal Token texture & fix wrong color order 2019-06-04 18:17:52 +02:00
chylex dcb743e198 Add a WIP command to spawn Portal Tokens 2019-06-04 16:19:59 +02:00
chylex cdb77123d5 Implement creative mode Portal Token teleportation/generation 2019-06-04 16:16:38 +02:00
chylex 613c3ba725 Fix wrong territory spawn/interest point Y value 2019-06-04 16:14:32 +02:00
chylex 5886a2027f Add Jar o' Dust w/ special rendering, behavior, and recipes (and a few issues) 2019-06-03 08:31:26 +02:00
chylex e1bbff6ec6 Update existing code to use the new Tessellator extensions 2019-06-03 02:03:31 +02:00
chylex 756024f1cf Add Tessellator extensions 2019-06-03 02:02:42 +02:00
chylex 8f82173f11 Add Infused Glass w/ connected texture and recipe 2019-06-01 12:18:09 +02:00
chylex b015ebd949 Fix Dusty Stone not being harvestable using Scorching Tools 2019-06-01 12:12:42 +02:00
chylex e1e119ca46 Add interface for blocks w/ multiple harvest tools 2019-06-01 12:12:23 +02:00
chylex 3a7964a20a Use Map.getValue instead of [key]!! 2019-06-01 03:04:27 +02:00
chylex 86aabd10bb Refactor burn time handling in ItemIgneousRock 2019-06-01 01:57:02 +02:00
chylex 3a63b7a724 Fix IDE warnings 2019-06-01 01:56:28 +02:00
chylex e62cdef24c Remove unnecessary return type declarations 2019-06-01 01:55:28 +02:00
chylex e9afad1260 Update existing code to use the new Block/IBlockState extensions 2019-06-01 01:34:22 +02:00
chylex 6cf9966804 Add Block & IBlockState extensions 2019-06-01 01:27:46 +02:00
chylex 347d8db4d2 Redo Whitebark Log side texture 2019-05-31 23:03:47 +02:00
chylex aa1870e475 Add WIP Dusty Stone (assets, drops, recipes) 2019-05-31 03:11:02 +02:00
chylex d5def412a8 Add Whitebark wood blocks (Log, Bark, Planks, Stairs, Slabs) 2019-05-16 02:00:47 +02:00
chylex 84e5246e21 Add ItemBlockSlabFuel for wooden slabs 2019-05-16 00:14:36 +02:00
chylex 1bda5c1181 Make Infused TNT, Ancient Cobweb, Dry Vines flammable 2019-05-16 00:13:37 +02:00
chylex 7f83098454 Set void parameters for The Hub 2019-05-15 17:52:10 +02:00
chylex f163aa0ccc Implement client-side void effects 2019-05-15 17:52:10 +02:00
chylex f54b382a3c Implement ellipsoid void with custom damage 2019-05-15 17:43:30 +02:00
chylex aa1d04f640 Add 'wither' damage title 2019-05-15 17:12:59 +02:00
chylex 984ffcc550 Cache value of TerritoryInstance.topLeftChunk & add centerPoint 2019-05-15 16:26:01 +02:00
chylex fdc82784d1 Minor formatting fixes 2019-05-15 02:58:33 +02:00
chylex bde0cc8a1e Refactor TerritoryRenderer 2019-05-15 02:57:26 +02:00
chylex 2019e1f32b Refactor all uses of Minecraft class to use the new helper 2019-05-13 20:06:07 +02:00
chylex fcac20a8b6 Add helper for Minecraft class 2019-05-13 20:01:39 +02:00
chylex f62517cd0f Update territory environment parameters for The Hub 2019-05-13 00:56:24 +02:00
chylex c6db72a92b Implement skycube, skydome, and sun renderers 2019-05-13 00:47:54 +02:00
chylex 58ebcf08dc Remove skyColor and define a general environment renderer 2019-05-12 19:51:00 +02:00
chylex 519b5dad7f Implement The Hub generation & Token handling 2019-05-01 14:26:52 +02:00
chylex 872ab0156e Add territory entry for Forgotten Tombs 2019-05-01 14:24:32 +02:00
chylex 58455ff81f Add helper for portal generation 2019-05-01 14:08:58 +02:00
chylex 93b0e5ce9d Change NBTTagCompound.getEnum to return null on invalid string 2019-05-01 13:42:07 +02:00
chylex 33cdadcf42 Implement Token Holder charge & special territory-based behaviors 2019-05-01 05:53:09 +02:00
chylex 583a161276 Add a simple interface for parameterized noise generation 2019-04-30 03:49:37 +02:00
chylex 7c7cd36dc7 Add cave generation system w/ a few basic component implementations 2019-04-29 21:06:25 +02:00
chylex ca051544c5 Implement blob generation strategies 2019-04-29 17:21:48 +02:00
chylex a4b7205303 Tweak XP drops of End Powder Ore 2019-04-29 17:17:21 +02:00
chylex c0df0be37f Add base classes for blob generation 2019-04-29 17:17:20 +02:00
chylex c9ba15aadb Move SegmentedWorld size validation into chunk generator 2019-04-29 17:17:20 +02:00
chylex 2f62d42908 Add RandomRange 2019-04-29 17:17:20 +02:00
chylex 8ee9d2ce26 Add a Size constructor that initializes all axes with one value & expand method 2019-04-28 23:36:50 +02:00
chylex 3f93652e4e Add ore generation system with basic techniques (single, adjacent, distance, air checking) 2019-04-26 02:24:29 +02:00
chylex 2d2803296e Minor formatting fixes, refactorings, and a comment tweak 2019-04-26 01:24:46 +02:00
chylex 27864ee796 Work on territory generation (default block, boundary checks, block placement) 2019-04-25 22:24:07 +02:00
chylex 2b7509dcf4 Add extensions (Vec3d.withY/scaleY, Facing4/6.fromDirection) 2019-04-25 02:04:08 +02:00
chylex 7604aee5d9 Fix trinkets slot causing inventory sync crash when changing dimensions 2019-04-20 14:13:03 +02:00
chylex 9e89d058b5 Implement territory spawn points & teleportation 2019-04-20 13:52:48 +02:00
chylex d241ad5ca3 Add territory entry for The Hub 2019-04-20 13:51:26 +02:00
chylex 166f1537a3 Add Vec3d.toYaw extension 2019-04-20 13:48:31 +02:00
chylex 9933112e81 Fix stupid crash with Void Portal trying to render on non-existent blocks 2019-04-20 11:18:39 +02:00
chylex 9ff64ec118 Rename OverworldTeleporter to DimensionTeleporter 2019-04-20 11:02:33 +02:00
chylex ec0f9bbc99 Add remapRange variation for Doubles & Vec3d.scale w/ int/float factor 2019-04-20 09:50:28 +02:00
chylex 569a3274da Make SegmentedWorld an IStructureWorld & implement triggers 2019-04-19 21:19:09 +02:00
chylex 0c245d8669 Fix broken custom block state mappers after a refactoring 2019-04-19 16:28:04 +02:00
chylex 3e93223584 Move chunk generator and world provider classes into different packages 2019-04-19 10:03:31 +02:00
chylex b52f21db29 Use custom End world folder & add TODOs to chunk generator 2019-04-19 09:56:02 +02:00
chylex 64bc52393c Add WIP Token Holder (model, texture, basic behavior) 2019-04-18 13:16:49 +02:00
chylex f2c82b76d1 Add packet for instantly setting entity motion 2019-04-18 13:07:35 +02:00
chylex 1286e5e1f3 Add ByteBuf.writeFloatVec/readFloatVec extension 2019-04-18 13:07:35 +02:00
chylex 8ce6c7d0ba Remove debug chunk generator 2019-04-17 20:22:12 +02:00
chylex cb3b3a3a52 Add territory chunk generator 2019-04-17 20:20:04 +02:00
chylex 9150fc8b86 Add a basic 'segment' system for End chunk generation 2019-04-17 17:59:35 +02:00
chylex bb90999131 Disable world border in the End 2019-04-17 10:25:33 +02:00
chylex 26c6f1bdc1 Add territory title renderer 2019-04-17 06:24:29 +02:00
chylex 9fbc3c4f01 Update DCEVM settings to fix Forge event hot swap 2019-04-17 05:53:49 +02:00
chylex 5fec36f39d Move client model and renderer registrations to ModRendering 2019-04-16 09:23:22 +02:00
chylex 897dd7fa7c Add TODO to StructurePiece & fix comment in BlockAbstractChest 2019-04-16 07:15:26 +02:00
chylex 0721129e38 Add client-side Scaffolding structure detection and saving 2019-04-16 07:00:09 +02:00
chylex f557ded6e3 Add Energy Shrine to '/hee structure' command 2019-04-16 06:55:21 +02:00
chylex 73a92a9258 Add Void Portal GUI & inner portal blocks w/ Token activation and teleportation 2019-04-16 06:55:21 +02:00
chylex f3a543a075 Add The Hub territory description 2019-04-16 04:50:37 +02:00
chylex 158d208608 Implement return End Portals 2019-04-15 10:08:37 +02:00
chylex 95316fa75b Add portal controller interface & contact tracking, refactor inner area detection 2019-04-15 10:08:37 +02:00
chylex e67b1dc9d0 Update existing code to use new NBT extensions & tweak formatting 2019-04-15 09:04:51 +02:00
chylex a84e5583c3 NBT extensions (add getOrCreateCompound & Entity ones, move ItemStack ones) 2019-04-15 09:02:07 +02:00
chylex 47d4063026 Add storage for territory data & player Portal Tokens 2019-04-15 03:16:33 +02:00
chylex d57b9d21b1 Add World.perSavefileData extension 2019-04-15 02:43:09 +02:00
chylex 62f1e8bfa4 Add Void Portal blocks 2019-04-14 09:44:29 +02:00
chylex 5de2fc8d4e Prepare portal code for adding new portal types 2019-04-14 08:37:26 +02:00
chylex 0bc0f67b59 Allow skipping teleport event in Teleporter 2019-04-13 00:05:32 +02:00
chylex b69952e479 Add ItemStackHandler -> IInventory adapter 2019-04-12 17:40:26 +02:00
chylex 9a5b0fb1b7 Make SlotReadOnly a wrapper & add SlotFixValidityCheck because vanilla is stupid 2019-04-12 17:36:07 +02:00
chylex 34272dcd39 Add SlotWrapper & base chest container with wrapped slots 2019-04-12 17:31:27 +02:00
chylex af9aff65c4 Refactor Forge capabilities & add helpers and extensions to simplify code 2019-04-12 02:44:08 +02:00
chylex bc2c2de5b7 Rename BlockEndPortalCustom & refactor a few things 2019-04-11 16:59:29 +02:00
chylex 4cc75f1388 Automatically spawn inner portal blocks when placing the controller block 2019-04-11 14:54:49 +02:00
chylex bc4134dc3d Move portal fading animation from End Portal code to base classes 2019-04-11 04:06:56 +02:00
chylex cf5f940513 Add WIP Portal Token (texture & visuals) 2019-04-10 23:57:23 +02:00
chylex 3d3db3f497 Setup territory environment overrides in WorldProviderEndCustom 2019-04-10 23:20:07 +02:00
chylex fb594b135c Add classes to describe territory properties 2019-04-10 23:17:50 +02:00
chylex 38b858c360 Customize Enderman spawning rules in Overworld 2019-04-08 20:34:29 +02:00
chylex 0cf09810e1 Add WIP Enderman entity (loot, despawning, basic battle & teleportation logic) 2019-04-08 14:35:37 +02:00
chylex e4edb5543a Implement Enderman water debuff logic 2019-04-08 14:30:21 +02:00
chylex ded8ea3740 Implement Enderman teleportation logic 2019-04-08 14:29:30 +02:00
chylex c21fcbba7e Force instant rotation of entities staring at something during teleportation 2019-04-08 14:09:12 +02:00
chylex fee17f28da Add fading pixel particle 2019-04-08 14:07:49 +02:00
chylex e251e1635e Add AI to watch current target without moving 2019-04-07 21:28:52 +02:00
chylex 55b2ca902b Fix continuous AI tasks to actually trigger every tick 2019-04-07 19:31:17 +02:00
chylex 053e077e7e Update existing code to use new Vec3d utilities 2019-04-07 17:16:51 +02:00
chylex d2de5f6e2a Add Vec3d utilities (fromXZ, fromYaw, addY, subtractY) 2019-04-07 17:16:00 +02:00
chylex 05b4964cac Implement Enderman block handling logic 2019-04-07 16:29:11 +02:00
chylex a02d2addea Update existing code that used Teleporter's extended range 2019-04-06 15:02:41 +02:00
chylex a208d65243 Refactor Teleporter effect range & allow silent teleportation (no sound/particles) 2019-04-06 15:02:10 +02:00
chylex 3680b76503 Add a debug-only hack to enable infinite banner textures 2019-04-04 11:40:08 +02:00
chylex 6ac3bd673f Fix unused imports & simplify Pos in Stronghold pieces 2019-04-04 11:32:52 +02:00
chylex d8cf7c43d2 Split Energy Shrine 180° stairs to fix Gloomtorch placement & improve AABBs 2019-04-04 10:37:11 +02:00
chylex 73c3738dd7 Implement Energy Shrine trigger entity for particle and mob spawn control 2019-04-03 21:30:56 +02:00
chylex 3eca01b4b7 Make trigger entity's type public 2019-04-03 21:09:28 +02:00
chylex 4603fa2b0d Enable trigger entity updates on client side 2019-04-03 17:48:11 +02:00
chylex 178b920417 Update Stronghold trigger handlers for the new interface 2019-04-03 17:45:00 +02:00
chylex 9becaa84ee Modify trigger entity interface (custom world validation, default serialization impl) 2019-04-03 17:44:59 +02:00
chylex 12cda08d04 wtf intellij 2019-04-03 11:54:49 +02:00
chylex ba61241094 Implement Energy Shrine generation & surface pillars 2019-04-03 11:52:39 +02:00
chylex 7de6590e3f Disable vanilla Stronghold generation 2019-04-02 09:39:23 +02:00
chylex 35d8faef4c Implement Energy Shrine builder 2019-04-01 20:29:10 +02:00
chylex c8453fd9b9 Refactor Stronghold classes to match recent changes & cleanup generator 2019-04-01 20:18:44 +02:00
chylex 1b41e14b1f Minor refactoring (Size, PosExt, OverworldFeatures) 2019-04-01 20:17:07 +02:00
chylex 68867e5759 Update IStructureDescription's structure locator to take PosXZ 2019-04-01 20:15:57 +02:00
chylex 1ca7d57a14 Add IStructureBuild w/ list of bounding boxes forming the generated structure 2019-04-01 20:14:37 +02:00
chylex fdd785d9f6 Add Size.getPos(Alignment) 2019-04-01 20:12:27 +02:00
chylex f43c589533 Add PosXZ utility data class 2019-04-01 20:05:20 +02:00
chylex 0d4bf8c40d Add a bunch of Energy Shrine rooms 2019-03-31 15:14:43 +02:00
chylex 291618776f Add Energy Shrine main room pieces & abstract room class 2019-03-31 14:47:58 +02:00
chylex cc52a3d731 Add Energy Shrine corridor pieces 2019-03-31 14:43:28 +02:00
chylex 3a979793b7 Add Energy Shrine piece connection types 2019-03-31 14:34:43 +02:00
chylex 0ae433b166 Add Energy Shrine banner generator 2019-03-31 14:32:14 +02:00
chylex f49d735270 Add Energy Shrine block palette & base piece class 2019-03-31 14:32:14 +02:00
chylex f941bf6133 Add VM parameters to improve DCEVM performance 2019-03-31 13:53:39 +02:00
chylex c2cee5d5cd Refactor and cleanup StrongholdBuilder 2019-03-31 09:49:38 +02:00
chylex d48dff9fc8 Refactor some structure utilities into an abstract class in IStructureBuilder 2019-03-31 09:39:52 +02:00
chylex 81f8cadb86 Update existing code to use updated Random.removeItem extensions 2019-03-31 08:27:37 +02:00
chylex 69b91d88da Fix inconsistencies between Random.removeItem and Random.nextItem 2019-03-31 08:26:31 +02:00
chylex 241eb42b0c Update existing code to use IBlockState facing extensions 2019-03-31 08:03:30 +02:00
chylex 1d31272418 Rename EnumFacingExt & add IBlockState extensions for facing 2019-03-31 08:03:30 +02:00
chylex b1201e0088 Add Energy Shrine loot tables 2019-03-31 04:05:03 +02:00
chylex 96c3f24be3 Add loot table function to pick a random Smooth Gloomrock color 2019-03-31 04:00:18 +02:00
chylex 971de3e0b4 Add Infusion.byName & basic loot table function to apply random infusions 2019-03-30 16:21:59 +01:00
chylex c119b52247 Minor formatting fixes 2019-03-30 15:29:25 +01:00
chylex ee44e029ea Add a loot table property that allows sorting stacks in a specific order 2019-03-30 13:16:46 +01:00
chylex 4a191ee98e Separate loot table and loot pool configuration to fix weirdness 2019-03-30 09:38:57 +01:00
chylex 7cd00e9c4a Propertly define how structure piece connection attachment should work 2019-03-30 07:13:40 +01:00
chylex 71fb850f98 Add IStructureTrigger for colored beds 2019-03-30 03:17:33 +01:00
chylex a4eb927ef7 Fix filecopy.ps1 to work on older versions of PowerShell 2019-03-28 21:29:35 +01:00
chylex e5ea8377b0 Allow specifying position of starting structure piece 2019-03-20 11:29:38 +01:00
chylex e1932d141a Add support for even-sized structure piece connections 2019-03-20 11:29:38 +01:00
chylex a5fde1de74 Add new subcommands to '/hee structure' (resetcache, norots) 2019-03-20 10:57:29 +01:00
chylex dea6d315a0 Improve Smooth Gloomrock Stairs side texture 2019-03-18 11:16:54 +01:00
chylex 045bbe3f11 Update Stronghold classes to use Air singleton 2019-03-17 12:04:01 +01:00
chylex 9f05e04796 Add IStructureWorld.placeWalls & IBlockPicker.Air 2019-03-17 12:02:31 +01:00
chylex 86be7ad8d6 Add Stronghold to '/hee structure' command 2019-03-16 18:42:15 +01:00
chylex 0dc7b2ecc2 Add a debug command for structures 2019-03-16 18:39:02 +01:00
chylex 9a36fba5fa Improve Smooth Gloomrock Slab side texture 2019-03-16 17:39:52 +01:00
chylex 2e2cd502cc Reorganize all GUI and container-related classes into new packages 2019-03-16 14:20:23 +01:00
chylex 072be51c35 Reorganize all rendering-related classes into new packages 2019-03-16 14:03:02 +01:00
chylex 21ea330124 Add script used to generate Stardust Ore texture variations 2019-03-16 12:04:18 +01:00
chylex d133636386 Implement Death Flower withering logic 2019-03-16 11:58:00 +01:00
chylex 713d22105d Update EndermiteTeleportLogic to use Teleporter.nearLocation 2019-03-16 09:53:16 +01:00
chylex b3beeb114d Add Teleporter.nearLocation to generalize multiple teleport attempts 2019-03-16 09:53:05 +01:00
chylex d473083f5a Make Teleporter.resetFall true by default 2019-03-16 09:09:14 +01:00
chylex 75ea906d23 Tweak Ring of Hunger's balance 2019-03-15 20:25:50 +01:00
chylex d9188f4d60 Trigger item use stat when a Trinket breaks 2019-03-15 20:25:36 +01:00
chylex 6e264ee58a Minor formatting fixes 2019-03-15 15:22:03 +01:00
chylex 8243673e0e Replace vanilla Totem of Undying w/ custom Trinket logic 2019-03-15 15:13:29 +01:00
chylex 7e6b47d832 Add a 'horribly dying Villager' entity 2019-03-15 13:53:58 +01:00
chylex 0671b10aa9 Add growing pixel particle 2019-03-15 13:53:58 +01:00
chylex ba97cf077e Add pixel particle texture 2019-03-15 13:14:32 +01:00
chylex d513c89514 Replace uses of deprecated I18n class 2019-03-14 19:07:20 +01:00
chylex 00ac7bf8f8 Add customizable FX when a Trinket is broken 2019-03-01 17:21:56 +01:00
chylex 48befaf2d2 Reduce log spam from Igneous Rock smelting transformations 2019-03-01 15:09:11 +01:00
chylex 676e4207f4 Fix/workaround log warnings at startup 2019-03-01 14:54:38 +01:00
chylex 03cd848e5b Add Energy Cluster inventory texture & localized name 2019-03-01 14:45:55 +01:00
chylex 070a949eea Implement Dispersed Cluster generation 2019-02-28 21:33:58 +01:00
chylex b0bfe622a0 Generalize worldgen chunk grid logic & fix negative coordinates 2019-02-28 21:09:38 +01:00
chylex 2c506b4436 Tweak behavior of Ancient Cobweb & Dry Vines to work better in Strongholds 2019-02-28 14:09:21 +01:00
chylex 6482e44cc3 Finish Stronghold generation (tweak weights and piece ordering) 2019-02-28 14:07:40 +01:00
chylex 213bb39121 Update WorldToStructureWorldAdapter to take Random in constructor 2019-02-28 14:01:05 +01:00
chylex e2ec225634 Fix a few bugs & finish up Stronghold pieces 2019-02-28 13:59:36 +01:00
chylex 664e957b84 Update Stronghold code for new PaletteBuilder & IStructureGeneratorFromFile 2019-02-28 10:27:24 +01:00
chylex 5029eb41ed Add methods to save structures into files 2019-02-28 10:26:22 +01:00
chylex 58ef583d46 Add BoundingBox.size 2019-02-28 09:58:55 +01:00
chylex 402b72bac8 Rewrite PaletteBuilder to allow palettes for structure development 2019-02-28 09:58:08 +01:00
chylex fcff4b5380 Add PS script to copy file into clipboard
AWT Toolkit is bork..
2019-02-27 22:30:50 +01:00
chylex df101cad2a Prepare to add more PowerShell scripts, woo! 2019-02-27 22:29:28 +01:00
chylex f463d917d4 Add Scaffolding 2019-02-27 17:22:31 +01:00
chylex c6e8c56c26 Implement Stronghold generation w/ Eye of Ender search (and tweaks) 2019-02-27 12:44:36 +01:00
chylex 7cee8db35e Implement Stronghold builder & update size and pieces 2019-02-25 10:48:43 +01:00
chylex cdc6321f25 Add OverworldFeatures to register worldgen 2019-02-24 22:39:47 +01:00
chylex 430692cdef Add BoundingBox.center 2019-02-24 22:35:52 +01:00
chylex f1afdcd3c7 Minor code tweaks & add ignored packages in autocomplete 2019-02-24 13:26:02 +01:00
chylex ea7804d8dc Add a few utilities to structure & weighted list classes 2019-02-24 13:18:44 +01:00
chylex 346896e2df Implement Stronghold piece types & custom piece Instance 2019-02-24 13:07:03 +01:00
chylex 03d9663460 Add Stronghold stair connection that cannot connect to doors 2019-02-24 11:11:14 +01:00
chylex 2dfa54db14 Work on Stronghold pieces (fix portal connections, allow merging relics into doors) 2019-02-24 11:09:16 +01:00
chylex 3f08d6d011 Work on structure piece code (merging, chaining & removal, mutability) 2019-02-23 15:51:37 +01:00
chylex c2def2fc6e Add Rotation4 w/ permutation picker to EnumFacingExt 2019-02-23 14:24:09 +01:00
chylex 8fd1831e06 Change setupRecipeNBT methods to take an ItemStack instead of IRecipe 2019-02-23 14:22:06 +01:00
chylex c612e94eaf Add MutableWeightedList 2019-02-22 09:13:15 +01:00
chylex ad297cdfc9 Update Teleporter to use sendToTracking 2019-02-16 02:02:33 +01:00
chylex 7cef62bc9a Add ModNetwork.sendToTracking 2019-02-16 00:10:28 +01:00
chylex 72510821d7 Add constants and extensions for entity attributes 2019-02-15 17:52:42 +01:00
chylex 9a35db35bd Add Enderman isShaking property 2019-02-15 17:47:20 +01:00
chylex a6c52b048f Fix Enderman Head rendering issues (culling, default transform) 2019-02-15 17:03:43 +01:00
chylex eb7913e453 Minor refactoring (missing SideOnly, import order, comment) 2019-02-14 18:00:42 +01:00
chylex 59903fcf14 Add Enderman Head w/ item and armor model, and a hacked up block 2019-02-14 16:08:16 +01:00
chylex d98fed7e19 Add Random.nextVector2 extension 2019-02-14 12:50:49 +01:00
chylex ccb7b68a25 Add entity AI for picking up blocks 2019-02-13 23:09:06 +01:00
chylex 4e81ee0762 Make entity teleportation instant client-side 2019-02-13 18:07:06 +01:00
chylex cd5c31f574 Refactor Teleporter to randomize particle position by size of teleported object 2019-02-13 18:04:43 +01:00
chylex 6282bf832d Refactor Teleporter to use teleported entity's sound category by default 2019-02-13 12:27:15 +01:00
chylex e9de4593b4 Add World extension for per-dimension storage 2019-02-11 19:25:12 +01:00
chylex 5ac5d72dc5 Implement Death Flower healing using End Powder 2019-02-11 18:22:17 +01:00
chylex 1050084452 Add WIP Death Flower (variations, models, textures) 2019-02-11 18:20:25 +01:00
chylex a5b260e47c Add base for custom particle textures 2019-02-11 10:41:41 +01:00
chylex a6cf78fec4 Add base block and EnumPlantType for plants that grow on End Stone 2019-02-10 17:41:25 +01:00
chylex 10c4298247 Ensure enum modifications are applied as early as possible 2019-02-10 15:02:33 +01:00
chylex 5ab345b67e Minor formatting fixes and updates 2019-02-10 14:59:18 +01:00
chylex 16d4730513 Add IOffset.Gaussian and IColor.toVec 2019-02-10 14:57:52 +01:00
chylex d58ef7e81e Refactor block property definitions 2019-02-10 10:24:36 +01:00
chylex 9e52d5ffd2 Replace PropertyDefault.java (Kotlin fixed the compile error?) 2019-02-10 10:11:49 +01:00
chylex cdb1540850 Change Energy Oracle recipe 2019-02-09 14:52:30 +01:00
chylex 903636aadd Fix Void Miner not mining some blocks because shit's hardcoded 2019-02-09 13:55:27 +01:00
chylex 79a083374b Implement Stronghold Silverfish spawner & trap triggers 2019-02-09 10:13:51 +01:00
chylex e7921103e7 Define Stronghold size & update Stone Brick palette and checks 2019-02-09 10:02:02 +01:00
chylex 2a5a8048f9 Allow constructing AxisAlignedBB using Size 2019-02-09 09:51:29 +01:00
chylex 50b38a5255 Tweak technical trigger entity timer 2019-02-09 09:49:52 +01:00
chylex a844e2aa02 Allow delaying Silverfish hiding AI & tweak summon AI 2019-02-09 09:44:47 +01:00
chylex 409ba7ab47 Fix Stronghold corridors not generating air inside 2019-02-09 09:02:09 +01:00
chylex 72f146d0a8 Add all Stronghold structure pieces (without Silverfish triggers) 2019-02-06 06:44:35 +01:00
chylex 8d187d4d5d Add Stronghold loot tables 2019-02-05 05:06:08 +01:00
chylex b9343debe0 Add Stronghold block palette 2019-02-05 05:04:18 +01:00
chylex 170bcdc801 Add base classes for worldgen structures made of connected pieces 2019-02-05 04:21:11 +01:00
chylex 2521aac0c0 Add FutureBlocks to help 1.13 transition & make Loot Chest inventory public 2019-02-05 03:38:08 +01:00
chylex 7c91238331 Add WIP Knowledge Note (texture & item registry entry) 2019-02-04 22:11:40 +01:00
chylex 22230fe233 Tweak item organization & Energy Cluster sounds 2019-02-04 21:28:28 +01:00
chylex 46c5a9bf67 Add a technical entity to handle custom triggers 2019-02-04 17:35:54 +01:00
chylex 619fde1d88 Add IStructureTriggers for generic entities and tile entities 2019-02-04 17:32:23 +01:00
chylex 70271512a3 Add base class for technical entities 2019-02-04 17:32:22 +01:00
chylex 44017a5039 Add IStructureTriggers for concrete tile entities (Chests, Flower Pots, Energy Clusters) 2019-02-03 17:47:53 +01:00
chylex 3f771e0797 Add IStructureTrigger wrapper for rotations 2019-02-03 17:34:45 +01:00
chylex 9029fc2d81 Add IStructureWorld adapter to place structures into a World 2019-02-03 16:43:21 +01:00
chylex ed664e03ba Add IStructureWorld wrappers for offset and rotations 2019-02-03 16:38:57 +01:00
chylex c44e434457 Add custom structure file loading & block palette system 2019-02-03 15:38:00 +01:00
chylex 7ca5371ca8 Add key interfaces for worldgen structures 2019-02-03 15:17:08 +01:00
chylex bb348ef1d1 Add option to modify loot pool roll bias in loot tables 2019-02-02 22:57:32 +01:00
chylex a9e46c4f1d Add option to disable stack splitting in loot tables 2019-02-02 22:52:57 +01:00
chylex 05bb8dcb36 Add support for custom properties in loot pool names 2019-02-02 22:52:16 +01:00
chylex fec0b00928 Add utilities for worldgen (BoundingBox, Size, EnumFacing tweaks) 2019-02-01 21:36:59 +01:00
chylex f5c7736f9e Update Random.nextItem extensions (enums & nullability) 2019-02-01 21:09:41 +01:00
chylex 77c2a05a64 Add a few utilities (WeightedList.toString, BlockPos.min/max, generics) 2019-01-25 18:14:00 +01:00
chylex bdaa344c55 Fix not being able to place Torches on Stone Brick Wall blocks 2019-01-25 14:51:50 +01:00
chylex 85c7667474 Fix Tables stalling when it fails to assign new processes to unassigned Pedestals 2019-01-23 17:57:03 +01:00
chylex 97fac2e3b1 Implement supporting item mechanic for Tables & tweak default Pedestal status color 2019-01-23 16:48:13 +01:00
chylex 7134f3ee89 Update Accumulation Table (rewrite serializer, report blocked work ticks) 2019-01-23 16:21:44 +01:00
chylex ba29e197d2 Allow Table processes to report successful/blocked work tick w/ particles 2019-01-23 16:18:10 +01:00
chylex f9a72c9ab4 Fix Pedestal breaking when marked as dedicated output while running a process 2019-01-23 13:36:22 +01:00
chylex be7cf98a61 Add a few general Table process serializers 2019-01-23 13:35:18 +01:00
chylex 2a53e20018 Move Table process interfaces into a separate package 2019-01-23 11:34:58 +01:00
chylex 565f2c8fe8 Add a WIP command to test Causatum stages 2019-01-22 08:32:41 +01:00
chylex 6c6142d429 Add Ender Causatum stages and storage 2019-01-22 08:32:40 +01:00
chylex b21337e482 Refactor Tables (block construction, process serialization, generics, naming) 2019-01-21 15:11:02 +01:00
chylex 63e4afad9f Implement non-silent Table Pedestal input replacement & tweak output smoke particles 2019-01-21 10:47:01 +01:00
chylex c3058e2cab Fix missing Table process lifecycle call in TableProcessList.remove(predicate) 2019-01-21 05:04:18 +01:00
chylex 6fba676d03 Minor refactoring (fix imports, unnecessary parameter, inlining) 2019-01-20 11:46:20 +01:00
chylex bca7932d8b Fix Table process not stopping when one of its Pedestals is unlinked 2019-01-20 11:01:40 +01:00
chylex 89ef11a389 Refactor Table process handling and lifecycle 2019-01-20 11:01:39 +01:00
chylex eb5d5a7b32 Add particle effects to Tables (Energy draining, Pedestal processing) 2019-01-20 07:55:58 +01:00
chylex 85616a0b53 Refactor duplicate code in Particle classes 2019-01-19 10:53:43 +01:00
chylex e8a4422676 Add particle effect when charging a held item with Energy 2019-01-19 03:28:48 +01:00
chylex 7bcb025bcb Refactor Energy Cluster particle & add base particle class for Energy transfers 2019-01-19 03:00:36 +01:00
chylex 1545f62ff3 Fix invalid Line particle shape when amount of points equals 1 2019-01-18 12:48:11 +01:00
chylex f8660f4af5 Implement thrown Igneous Rock FX 2019-01-18 05:59:26 +01:00
chylex cba2b0fbdb Refactor PacketClientFX and all FX objects to use the new system 2019-01-18 05:04:24 +01:00
chylex 6791ed30b4 Create reusable FX data and handler classes w/ common parameters 2019-01-18 05:00:35 +01:00
chylex 548953bf9a Add a mechanism to toggle AI tasks 2019-01-18 03:45:53 +01:00
chylex f9d4542c90 Fix double Dark Chest render bounding box 2019-01-18 01:17:41 +01:00
chylex 4b4124821e Implement Ocelot sitting AI for custom Chests 2019-01-18 01:11:10 +01:00
chylex 8cd98142ff Trigger instability from Energy Cluster leaks and breaking 2019-01-17 23:40:27 +01:00
chylex fe6dcbc990 Implement Energy Cluster health-based leaking & rebalance leak values 2019-01-17 23:00:18 +01:00
chylex 049717c780 Implement Energy Cluster proximity 2019-01-17 08:39:27 +01:00
chylex 69479edf9c Refactor Energy Cluster leaking mechanics & update region instability leak 2019-01-17 08:24:14 +01:00
chylex e8b9e680ed Implement a single-block Corrupted Energy leak & use it in End Portal 2019-01-17 08:15:24 +01:00
chylex 50c2518f91 Allow resetting dimension instability action multiplier & tweak naming 2019-01-17 05:40:28 +01:00
chylex 48d53d1e7d Implement AI that targets on eye contact 2019-01-13 20:03:57 +01:00
chylex 16f868bd19 Refactor targeting AI to simplify code 2019-01-13 17:08:37 +01:00
chylex d8755dbfce Replace vanilla Enderman base behavior and rendering 2019-01-11 16:23:13 +01:00
chylex d7eaf48fc2 Add Riding infusion to Ender Pearls 2019-01-10 20:19:26 +01:00
chylex 0c2d6d5956 Fix Ender Pearls going too far when phasing & increase bounding box size 2019-01-10 20:02:08 +01:00
chylex d815c57456 Tweak code style in packets 2019-01-10 19:58:32 +01:00
chylex a6990f4e43 Add a packet that forces dismount at a set location during teleportation 2019-01-10 19:54:22 +01:00
chylex 8afd19a6ad Implement Looting loot table condition 2019-01-10 15:39:30 +01:00
chylex e289f60713 Generalize Fortune loot condition 2019-01-10 15:38:45 +01:00
chylex a8bf0fad76 Fix Spatial Dash Gem range & implement infusions (capacity, distance, speed, vigor) 2019-01-10 11:35:03 +01:00
chylex 525a0a6a23 Implement Energy Oracle infusions (capacity, distance, vigor) 2019-01-10 11:02:57 +01:00
chylex 5d5efb3c29 Add infusions for certain Energy items & Vigor level calculations 2019-01-10 11:00:02 +01:00
chylex 35cfad4123 Refactor infusion construction & tweak colors of some infusions and Binding Essence 2019-01-09 19:37:14 +01:00
chylex 51f8d3b281 Replace Eye of Ender w/ custom recipe, movement behavior, and FX 2019-01-09 18:08:45 +01:00
chylex e1c0ce60af Add glitter particle type 2019-01-09 16:27:03 +01:00
chylex a424f8fc44 Minor style fixes 2019-01-09 16:06:59 +01:00
chylex a11aac50d2 Implement a few Ender Pearl infusions (harmless, phasing, slow) 2019-01-08 11:50:05 +01:00
chylex e1de134d35 Add Infused Ender Pearl item & infusion list to the entity 2019-01-08 11:31:16 +01:00
chylex cd3948b981 Replace vanilla Ender Pearl entity w/ custom impact behavior 2019-01-08 11:02:21 +01:00
chylex 7d62af8e9e Add block position as a parameter to RayTracer collide check callback 2019-01-08 10:32:40 +01:00
chylex 7f35b2af63 Fix missing damage implementation in Teleporter 2019-01-07 20:20:15 +01:00
chylex d2ecdffd6a Fix minor style issues (imports, ByteBuf usage, Item translation key prefixing) 2019-01-07 14:28:13 +01:00
chylex c17a4cddb6 Tweak Void Salad to use the "starve" death message 2019-01-07 14:23:38 +01:00
chylex 360537af31 Refactor Damage to allow null remote source for indirect damage 2019-01-07 14:09:36 +01:00
chylex 4a7da9e973 Add Endersol w/ assets 2019-01-04 18:38:13 +01:00
chylex f71c6e9443 Add utility extension to clone block sound data 2019-01-04 18:36:28 +01:00
chylex 29d6b2f76a Add Scorching tools w/ recipes and custom fortune behavior 2019-01-04 11:40:54 +01:00
chylex 0d5c7eca89 Add (probably WIP) assets for Scorching tools & sword 2019-01-04 11:40:53 +01:00
chylex 3c2e9b2e1b Add a flame particle variant with customizable lifespan 2019-01-04 11:30:37 +01:00
chylex 059f4bdf4d Update existing repair handlers to use the new interface 2019-01-04 11:21:36 +01:00
chylex d18f300c4b Add a custom interface-based Anvil repair handler 2019-01-04 11:21:36 +01:00
chylex a533df19d4 Add Infernium Ingot & Dirty Infernium Ingot w/ recipe 2019-01-03 09:28:47 +01:00
chylex dca610893f Add a debug chunk generator to the End 2019-01-03 03:40:12 +01:00
chylex 1db6b61029 Add Talisman of Griefing 2019-01-01 06:17:57 +01:00
chylex a992c3883c Minor tweaks (IOffset entity constructor, unnecessary code, cleanup) 2019-01-01 03:41:59 +01:00
chylex bb5af7b0c8 Allow cloning an explosion w/ modified parameters 2019-01-01 03:41:59 +01:00
chylex 307ebe0643 Finish implementing dimension & region instability for all dimensions 2018-12-30 06:37:38 +01:00
chylex 15caa41c38 Implement territory chunk grid system w/ a few test territories 2018-12-30 06:28:55 +01:00
chylex ea0b2e440f Replace vanilla End world provider & disable dragon fight manager 2018-12-30 05:48:47 +01:00
chylex 9be0a2a91f Add destructuring extensions for ChunkPos 2018-12-30 05:42:20 +01:00
chylex f225319e51 Update Endermites (render range, instability relief, Corrupted Energy immunity) 2018-12-28 05:09:29 +01:00
chylex 0632538268 Add dimension instability triggers to teleportation 2018-12-28 05:05:15 +01:00
chylex 9001424821 Add a method to leak a set amount of Energy from a Cluster 2018-12-28 05:02:07 +01:00
chylex 480a2da36b Implement main logic and capability handling for dimension & region instability 2018-12-28 04:25:51 +01:00
chylex 48e9aadc0f Add interfaces and utilities for instability 2018-12-27 21:15:04 +01:00
chylex 663554a97b Add parameters to Teleporter (reset pathfinding, extend FX range) & tweak effects 2018-12-27 19:55:51 +01:00
chylex 879ece80f0 Add interface to mark entity as immune to Corrupted Energy 2018-12-27 16:06:29 +01:00
chylex a4c35c1500 Add Random.removeItem extension 2018-12-25 13:39:21 +01:00
chylex 0197d7c5a1 Fix non-lethal damage sometimes leaving player at 1 full heart 2018-12-25 02:30:22 +01:00
chylex 9283a106b7 Minor code style tweaks 2018-12-25 02:08:39 +01:00
chylex 5ae5d3cca7 Add instability-spawned Endermite variation & disable Endermite particles 2018-12-22 17:26:45 +01:00
chylex c7f35e221a Add a way to pause particle effect spawning 2018-12-22 16:21:37 +01:00
chylex bc0b826013 Fix entity translation key 2018-12-22 16:18:57 +01:00
chylex fd699eff11 Tweak Corrupted Energy particle color 2018-12-22 16:18:57 +01:00
chylex fd70dd5da0 Fix Infused TNT and Endermite serialization 2018-12-22 13:42:20 +01:00
chylex 331a4ae7e4 Replace Endermite and implement custom behavior, despawning, and drops 2018-12-22 12:32:16 +01:00
chylex 7109f3dde1 Add custom EntityAIWanderAvoidWater constructor 2018-12-22 12:32:16 +01:00
chylex b5db81dd47 Add mob AI that reduces randomness of wandering 2018-12-22 12:25:38 +01:00
chylex a8aadfab54 Refactor entity override registration 2018-12-22 10:15:27 +01:00
chylex 38fdff2266 Fix being able to open an Amulet of Recovery without recharging it 2018-12-20 09:22:48 +01:00
chylex fa6e5b12c9 Implement modded & Trinket slot handling in Amulet of Recovery 2018-12-20 09:22:48 +01:00
chylex 453f79e33c Fix infusions causing items to lose NBT data 2018-12-20 08:47:32 +01:00
chylex c09ae421fe Fix Trinket duplication on death 2018-12-20 08:47:31 +01:00
chylex eebaa5238c Add NBTList.set 2018-12-20 08:47:31 +01:00
chylex 7587bb49ad Refactor Trinket Pouch serialization to use NBTItemStackList 2018-12-20 05:24:48 +01:00
chylex d8be6810ca Add Ring of Hunger 2018-12-19 15:29:48 +01:00
chylex 66d349166f Move infinite potion duration constants 2018-12-19 15:17:46 +01:00
chylex 30196e925c Rename and move base Item classes 2018-12-18 09:27:01 +01:00
chylex 689e221f01 Make Trinket Pouch infusable & add Expansion infusion 2018-12-18 08:31:05 +01:00
chylex e9c6a8e738 Refactor Infusion color constructors 2018-12-18 08:31:05 +01:00
chylex efeed74006 Add Trinket Pouch w/ custom GUI 2018-12-18 08:26:05 +01:00
chylex 7be6c6d4e9 Allow active Trinket items to provide their own ITrinketHandler instances 2018-12-17 01:27:51 +01:00
chylex b46c885f7c Add base Gui+Container classes for custom inventory interfaces 2018-12-16 07:02:06 +01:00
chylex 67d5e01804 Move SlotTrinketItem player inventory logic into a separate class 2018-12-16 06:53:11 +01:00
chylex 226eb20273 Add packet to tell server to open a GUI 2018-12-16 06:45:32 +01:00
chylex 1f2ffbcda9 Update DetectSlotChangeListener to return slot for item duplication prevention 2018-12-16 06:34:32 +01:00
chylex c66f5a354e Refactor Trinket handling in preparation for Trinket Pouch 2018-12-01 14:34:50 +01:00
chylex 3cb50dc162 Add Elytra w/ custom recipe and durability handling 2018-12-01 10:11:57 +01:00
chylex c5a3e0af24 Fix Table Pedestal render bounding box to include the item area 2018-12-01 10:10:58 +01:00
chylex 49858e4948 Add Binding Essence w/ recipe 2018-11-30 05:56:20 +01:00
chylex 9263572524 Add IInfusableItem & implement infusion colors and item transformations 2018-11-30 03:41:51 +01:00
chylex 4082c6b7ab Push config file for Statistic plugin 2018-11-28 06:26:25 +01:00
chylex 1b5c68c531 Add Compost w/ dispenser behavior and Humus drops 2018-11-28 00:12:26 +01:00
chylex f700df457e Add Accumulation Table 2018-11-27 09:29:46 +01:00
chylex 3d861aadc6 Push Table overlay asset file 2018-11-27 09:23:16 +01:00
chylex 8bfe5e7375 Let Table processes decide between consuming 1 item or the whole input stack 2018-11-27 09:20:34 +01:00
chylex 1aa475aa08 Spawn smoke particles on Table Pedestals when items are added to input/output 2018-11-27 05:37:55 +01:00
chylex 8d82171533 Add a custom smoke particle with modifiable scale 2018-11-27 05:33:38 +01:00
chylex 828a8a6471 Allow Redstone signal to pause Table processing 2018-11-27 03:29:45 +01:00
chylex 12024eaab1 Add Redstone Comparator signal to Table Pedestals 2018-11-27 03:27:26 +01:00
chylex 2344884366 Implement dedicated output Pedestals 2018-11-27 01:17:41 +01:00
chylex cec17ef207 Minor Table Pedestal fixes (consume all inputs, disable mipmapping, compile error) 2018-11-27 00:14:57 +01:00
chylex f6973351b3 Fix too many Table Pedestal item rendering spots 2018-11-26 06:10:23 +01:00
chylex 24040f5475 Implement logic for Table Pedestal status indicator (contents & processing) 2018-11-26 05:44:29 +01:00
chylex ef91d1bc87 Add a Table Pedestal status indicator handler 2018-11-26 05:41:44 +01:00
chylex c8d91449a5 Add a 20 tick Table process pause after updating Pedestal input 2018-11-26 05:37:39 +01:00
chylex f71813515a Add a NotifyOnChange delegate & use it in TEs 2018-11-26 01:09:35 +01:00
chylex 2724950bac Ensure Table processes are saved 2018-11-26 00:10:34 +01:00
chylex 8f383280f7 Refactor Table Pedestal inventory handling into a separate class 2018-11-26 00:08:40 +01:00
chylex f11e4ac38e Make ITrinketITem and IColor methods JvmDefault 2018-11-25 20:53:17 +01:00
chylex a57514dfcf Change RGB constructor(rgb: Int) to UByte to avoid confusion 2018-11-25 20:46:10 +01:00
chylex dc7d38d794 Update Kotlin to 1.3.10 & minor refactoring 2018-11-25 20:22:50 +01:00
chylex f0f120ce55 Implement base classes for describing and handling Table processes 2018-11-25 19:52:29 +01:00
chylex e14767977e Implement Table logic for process handling 2018-11-25 18:14:52 +01:00
chylex 19e71cbc96 Forgot to push TileEntityBaseTable.MarkDirtyOnChange delegate 2018-11-25 17:13:13 +01:00
chylex 48402b2ede Add methods to update and track Pedestal input & output 2018-11-25 16:32:44 +01:00
chylex 8af05dfcca Implement Table behavior for picking and draining Energy Clusters 2018-11-24 10:32:03 +01:00
chylex 39d33fe09f Tweak Table Link cooldown & play linking sound to all players 2018-11-24 09:02:02 +01:00
chylex 231d4b73c5 Refactor Table Pedestal linking behavior & implement Pedestal limit 2018-11-24 07:36:25 +01:00
chylex 9613c6f79f Add interfaces for Table processes & serialization 2018-11-23 21:11:14 +01:00
chylex 0767402469 Make TileEntityBase only refresh Notifying delegate on change & expose isLoaded 2018-11-23 21:07:33 +01:00
chylex 263fa987cd Add NBT extensions to simplify list construction and ItemStack lists 2018-11-14 14:56:36 +01:00
chylex 9442a13708 Add extensions to create/restore IInventory snapshots 2018-11-14 14:52:38 +01:00
chylex 19d4a4ded8 Add Void Salad w/ recipe 2018-11-11 23:55:50 +01:00
chylex 984ec1e8e9 Implement non-lethal damage processor 2018-11-11 22:55:16 +01:00
chylex 42645ab6da Add Purity status effect 2018-11-11 12:40:06 +01:00
chylex 3867a6afdf Move BlockEditor, ExplosionBuilder, RayTracer, and Teleporter to a different package 2018-11-10 20:48:19 +01:00
chylex 725f3a29bb Add Void Bucket w/ animation and recipe 2018-11-10 19:17:44 +01:00
chylex 230a8d650d Add Void Miner w/ recipe 2018-11-10 19:16:23 +01:00
chylex 86777ee7b5 Add a base class and material for Void tools 2018-11-10 19:16:23 +01:00
chylex a2fd85efbe Reimplement vanilla block raytracer with custom collision check behavior 2018-11-10 19:16:17 +01:00
chylex 9d2f291c30 Fix possibility of NPE when handling BreakEvent in BlockIgneousRockOre 2018-11-10 18:49:04 +01:00
chylex 8ce2fdc862 Add Entity extensions (lookPosVec, lookDirVec) and fix warnings 2018-11-10 17:51:21 +01:00
chylex dcebac266c Fix Ring of Preservation repair logic (only repair when damaged & use only 1 Diamond) 2018-11-06 01:41:01 +01:00
chylex a29616d1c9 Implement End Portal leaking Corrupted Energy 2018-11-05 17:55:16 +01:00
chylex d1ddcfb701 Refactor & update properties of Corrupted Energy leaks, fix damage 2018-11-05 17:54:07 +01:00
chylex 23ce6e8f5e Fix CombinedDamage causing damage every tick in some cases 2018-11-05 17:46:48 +01:00
chylex db4256ba6c Implement shift-clicking support for Trinket slot 2018-11-05 03:45:29 +01:00
chylex 6471b49b0e Add Scale of Freefall w/ recipe 2018-11-04 22:31:52 +01:00
chylex 87652ef4d4 Minor refactoring + event priority change in ItemAmuletOfRecovery 2018-11-04 22:19:21 +01:00
chylex 6a86bb093f Add TrinketHandler.getCurrentActiveItem and document ITrinketItem 2018-11-04 21:06:16 +01:00
chylex 65309c732b Update textures for Dragon Scale and Puzzle Medallion 2018-11-04 15:46:01 +01:00
chylex c7de7dc648 Add Ring of Preservation 2018-11-04 12:31:04 +01:00
chylex d2d49d1c69 Use copyIf in BlockTablePedestal & fix ItemBaseTrinket not being open 2018-11-04 12:27:43 +01:00
chylex 309d671d04 Add ItemStack.copyIf extension 2018-11-04 12:26:58 +01:00
chylex fe4b3c31c7 Rewrite BlockEditor.place to use Block.getStateForPlacement 2018-11-02 20:53:27 +01:00
chylex 36f4f1dd09 Add Table Link w/ recipe and sound effects 2018-11-02 16:11:12 +01:00
chylex 8cda9a7f6b Implement basic linking logic for Tables and Pedestals 2018-11-02 15:18:24 +01:00
chylex dfc05f80f1 Add BlockPos.updateState extension 2018-11-02 15:15:46 +01:00
chylex b85eb3cfca Update Gradle to 4.10.2 2018-10-31 13:38:55 +01:00
chylex 0e7cf4c049 Work on Table Pedestal (finish item rendering, add inventory interactions) 2018-10-31 12:44:18 +01:00
chylex bca3eba66e Add InvReverseWrapper (item handler implementation with reversed slot order) 2018-10-30 23:13:01 +01:00
chylex 7e95c10956 Move TE notification checks & FLAG_MARK_DIRTY handling to notifyUpdate 2018-10-30 22:28:01 +01:00
chylex adb1c3df17 Update existing code to use the new NBT extensions 2018-10-30 12:14:01 +01:00
chylex f7c525b4bd Add & update NBT extensions (BlockPos, presence checks, nullability) 2018-10-30 12:14:00 +01:00
chylex 45e4e0cf65 Add ItemStack.cleanupNBT extension w/ unit tests 2018-10-30 10:42:24 +01:00
chylex d93b3f67c1 Add WIP Table Pedestal (assets, model, rendering, inventory storage, recipe) 2018-10-29 23:48:42 +01:00
chylex 6d0b33be85 Minor refactoring and formatting fixes 2018-10-29 14:21:27 +01:00
chylex 13fd65ec58 Update existing classes to use new sound extensions 2018-10-28 13:24:38 +01:00
chylex e1afe9e2d6 Add SoundExt to simplify playing sound effects 2018-10-28 13:23:14 +01:00
chylex b93e9a4b2d Refactor TileEntityBaseChest inventory to use Kotlin's delegation pattern 2018-10-28 11:15:29 +01:00
chylex 5f9f96c055 Add several extension methods (ItemStack, BlockPos, NBT) 2018-10-27 14:36:12 +02:00
chylex c4afd56f9d Add Table Base w/ assets and base classes 2018-10-22 04:07:01 +02:00
chylex 650b8ef90a Add Dark Chest 2018-10-20 18:27:37 +02:00
chylex 0b20a03267 Add temporary ATs to simplify block builder until 1.13 comes 2018-10-20 18:17:01 +02:00
chylex 7b4c33a194 Refactor InfusionList.tag to use NBTEnumList.of 2018-10-20 00:10:05 +02:00
chylex b878300c27 Add Loot Chest w/ creative mode editing and custom opening sound 2018-10-17 18:47:21 +02:00
chylex 2b04c66a28 Simplify TileEntity GUI registration in ModGuiHandler 2018-10-17 16:34:48 +02:00
chylex 9b292ef7dc Add base classes for custom Chests 2018-10-17 15:44:34 +02:00
chylex 6202e75d4f Fix shift-clicking items into read-only slots 2018-10-17 13:28:41 +02:00
chylex 81e5e356bf Simplify NBTEnumList creation & tweak NBTObjectList exception messages 2018-10-17 11:42:37 +02:00
chylex df8b87d408 Add extensions to save/load inventories in NBT 2018-10-17 11:42:03 +02:00
chylex 8d68c8545c Fix some TEs not saving properly (Energy Cluster & End Portal Acceptor) 2018-10-17 11:39:11 +02:00
chylex a6a17d008a Refactor TileEntityBase serialization & add FLAG_MARK_DIRTY to Notifying delegate 2018-10-17 11:35:34 +02:00
chylex d4ff20c55d Update Forge and mappings 2018-10-15 20:50:38 +02:00
chylex 6b13c0b921 Fix Trinkets to respect 'keepInventory' rule 2018-10-15 19:19:52 +02:00
chylex 076a770054 Add Amulet of Recovery w/ recipe, custom model, and retrieval GUI 2018-10-15 19:19:52 +02:00
chylex fd68ddf03b Add method to change player's Trinket 2018-10-15 19:19:25 +02:00
chylex 696e5bbfab Add base class for Chest-like GUIs, read-only slot type, and listener for slot changes 2018-10-14 18:56:09 +02:00
chylex c4b3aa8b9f Add base Trinket item w/ custom tooltip and rarity 2018-10-14 18:01:47 +02:00
chylex 7f9f9996a0 Refactor ItemBaseEnergyUser (open some methods & add new getters) 2018-10-14 17:55:44 +02:00
chylex 9accb19903 Fix broken client->server packet handling 2018-10-14 14:30:44 +02:00
chylex f98c33050f Add GUI handler w/ packet for client GUI events 2018-10-14 11:49:46 +02:00
chylex 9ed7f393d1 Update existing code to use the new NBT extensions 2018-10-13 08:32:37 +02:00
chylex 331c56c903 Move 'heeTag' extensions to all NBTTagCompounds & update unit tests 2018-10-13 08:31:22 +02:00
chylex e139e29825 Fix inconsistency from autoformatting >:( 2018-10-13 06:00:45 +02:00
chylex 1b590ea53f Add extensions to write & read ItemStacks in NBT 2018-10-12 07:51:03 +02:00
chylex d37a0a1858 Add a trinket slot to player inventory 2018-10-11 13:54:29 +02:00
chylex 20c8db8efa Add particle effects to Ender Goo 2018-10-10 13:16:30 +02:00
chylex fb87e9435c Add entity height multiplier parameter to IShape.Point 2018-10-10 13:14:33 +02:00
chylex 1762df92ae Implement Ender Goo causing worsening negative effects to entities 2018-10-09 13:40:14 +02:00
chylex 89f6179eaf Add utilities to simplify Forge capabilities 2018-10-09 12:02:37 +02:00
chylex a549fe9b7b Implement Ender Goo affecting entity motion 2018-10-09 02:55:18 +02:00
chylex 53fffabd8f Generalize and refactor Ender Goo 2018-10-09 01:47:35 +02:00
chylex 27944f5342 Fix more block equality checks 2018-10-08 21:12:57 +02:00
chylex 620a87a6c7 Implement Corrupted Energy tolerance check 2018-10-08 01:56:28 +02:00
chylex 8c2cbd0c0c Add custom creature types 2018-10-08 01:55:51 +02:00
chylex 610d96cb3e Add Lifeless status effect 2018-10-08 01:48:35 +02:00
chylex bc2f59e869 Add base class for custom status effects 2018-10-07 18:16:28 +02:00
chylex 1a0254d6d5 Introduce ModPotions, tweak other registration code 2018-10-07 15:48:57 +02:00
chylex 2f9b482d4a Refactor Resource class 2018-10-07 15:42:35 +02:00
chylex b1a85adc48 Begin implementing Ender Goo (animated texture, overlay effects, custom bucket) 2018-10-06 18:54:34 +02:00
chylex e82fbd66a1 Add Dark Loam and Dark Loam Slab w/ recipe 2018-10-05 18:01:38 +02:00
chylex 579dee296d Fix brightness of custom slabs and stairs 2018-10-05 17:52:42 +02:00
chylex 517f0263f8 Tweak slab construction & fix localization keys for double slabs 2018-10-05 15:50:34 +02:00
chylex cdcea9c234 Add custom item repair recipe with End Powder 2018-10-05 14:52:06 +02:00
chylex d4136c017a Add base class for dynamic recipes 2018-10-05 14:51:25 +02:00
chylex 374d6fd6da Add Int.shlong extension (very necessary) 2018-10-05 14:43:21 +02:00
chylex 947518dfdd Update existing code to use the new ItemStack extensions 2018-10-05 13:39:33 +02:00
chylex b8041322e5 Add extensions for ItemStack (size, enchantments) & IInventory (renaming, iteration) 2018-10-05 13:33:29 +02:00
chylex 96a22b4830 Implement a TNT infusion (phasing w/ indestructible block collisions) 2018-10-04 21:22:58 +02:00
chylex fd40983fae Add extensions to deconstruct BlockPos and Vec3d objects 2018-10-04 21:10:00 +02:00
chylex 0c9dea7884 Delay breaking Ancient Cobwebs to fix weird client particle crash 2018-10-04 20:46:19 +02:00
chylex 6b2d73c864 Implement a TNT infusion (mining w/ special fishing mechanic) 2018-10-04 17:04:40 +02:00
chylex f18e481ac5 Implement a few TNT infusions (power, fire, trap, harmless) 2018-10-04 17:00:58 +02:00
chylex 8796cc1304 Add a custom item entity that spawns smoke 2018-10-04 15:19:14 +02:00
chylex 306755d3ac Add a way to sum multiple IOffset 2018-10-04 14:20:56 +02:00
chylex 7b49062afa Add remapRange utility function 2018-10-04 01:31:39 +02:00
chylex 5134ab2e44 Add Random.nextFloat that returns Double & update EntityItemIgneousRock 2018-10-04 01:29:56 +02:00
chylex a798b6405e Add '/hee infusions' command for testing 2018-10-03 21:52:51 +02:00
chylex 545acf4e0f Add base elements for Infused TNT 2018-10-03 21:48:54 +02:00
chylex d1c73594c3 Minor code fixes (parameter names & equality checks) 2018-10-03 19:37:34 +02:00
chylex 402387754d Reimplement vanilla explosions with more customizability 2018-10-03 14:58:19 +02:00
chylex 6f9985b5ef Generalize infusion storage and item behavior & fix tooltip spacing 2018-10-02 16:49:27 +02:00
chylex 78ec5286b7 Add Entity.useHeeTag extension & use it in EntityProjectileSpatialDash 2018-10-02 16:05:22 +02:00
chylex 1f68f4e0c5 Add EntityData delegate for synchronized entity properties 2018-10-02 16:04:07 +02:00
chylex 41ec8c0936 Simplify Corrupted Energy state json using empty state mapper 2018-10-02 15:37:57 +02:00
chylex 752fc2d4c8 Fix bugs with block registration params & add empty block state mapper 2018-10-02 15:34:48 +02:00
chylex 843f747811 Add Falling Obsidian w/ special falling entity and sound 2018-10-01 23:24:53 +02:00
chylex 4bca942856 Tweak EntityFallingBlockHeavy to let subclasses relocate during placement 2018-10-01 23:23:39 +02:00
chylex 362e718e27 Add empty sounds.json 2018-10-01 22:03:31 +02:00
chylex c30c5938fd IntelliJ is a great IDE with no glaring UX omissions Kappa 2018-10-01 14:33:33 +02:00
chylex 2336102de5 Add Ethereal Lantern w/ recipe 2018-10-01 13:03:54 +02:00
chylex 26378b6b1a Add Gloomtorch w/ recipe 2018-10-01 13:03:48 +02:00
chylex 35f8040a31 Spawn Corrupted Energy when a Cluster is destroyed 2018-09-30 18:33:24 +02:00
chylex 0287528291 Add Corrupted Energy & Cluster capacity deterioration 2018-09-30 18:32:02 +02:00
chylex 163c1468ef Add CombinedDamage to deal damage from multiple sources at once 2018-09-30 18:28:05 +02:00
chylex 167d0e5d16 Add BlockPos extensions to get all block positions in an area 2018-09-30 14:16:46 +02:00
chylex 11443ec1cd Fix vanilla bug with delayed lit particle interpolation 2018-09-29 15:40:59 +02:00
chylex 10e826dc53 Tweak & hide Energy Cluster selection box, and disable default particles 2018-09-29 15:38:30 +02:00
chylex 9f9dcc184d Add Energy Cluster rendering using particles 2018-09-29 15:38:24 +02:00
chylex b10a2ce816 Add a base class for Energy particles 2018-09-29 14:39:45 +02:00
chylex a625c3725a Override multiplyVelocity in ParticleBaseFloating (super method isn't uniform) 2018-09-29 13:09:04 +02:00
chylex ea118bcd59 Refactor Cluster color instantiation 2018-09-29 12:26:43 +02:00
chylex 37c60f31a3 Add a way to use custom skip function for particles 2018-09-29 12:23:19 +02:00
chylex b951c5335c Add a base class for floating particles (no gravity/collisions/random motion) 2018-09-28 22:12:18 +02:00
chylex 37351f8c6a Add teleportation and breaking FX to the Dragon Egg 2018-09-28 15:41:05 +02:00
chylex d7db2e55e4 Add custom teleportation FX & update existing code 2018-09-28 15:39:24 +02:00
chylex 5bd2cdf1b0 Add custom packet for particle and sound effects 2018-09-28 14:54:00 +02:00
chylex 0fae2ba2dd Add more ByteBuf extensions (strings, and apply-style method w/o return value) 2018-09-28 14:07:32 +02:00
chylex 55e63ea976 Implement particle spawning system for non-vanilla particle types 2018-09-28 12:44:29 +02:00
chylex 4d932dff42 Add a way to generate and validate particle data array 2018-09-28 12:43:15 +02:00
chylex a5fb760fd0 Update packets to use plain ByteBuf & add sendToAllAround w/ Vec3d parameter 2018-09-27 22:46:29 +02:00
chylex e88cab9ed2 Add ByteBuf extensions w/ unit tests 2018-09-27 22:44:21 +02:00
chylex 079ff94f3a Add particle effects to Igneous Rock 2018-09-26 21:36:08 +02:00
chylex 1dddd38654 Fix NetworkCheckHandler throwing when called in an undocumented circumstance 2018-09-26 21:03:30 +02:00
chylex 5461199bbe Begin implementing custom particle spawning system 2018-09-26 21:01:52 +02:00
chylex 2fe125bbbb Add extension method to get a point between two vectors 2018-09-26 17:28:13 +02:00
chylex 5fa62709be Fix End Portal rendering on older AMD cards 2018-09-25 12:57:00 +02:00
chylex 0aefcd227d Fix block culling in BlockSimpleShaped 2018-09-25 12:23:59 +02:00
chylex 4aec1e7bae Replace ResourceLocation constructor calls with utility methods 2018-09-25 12:01:01 +02:00
chylex e8c36b91ac Rename main mod object to HEE 2018-09-25 11:01:39 +02:00
chylex e67b3e032a Replace Dragon Egg and implement custom falling & interaction behavior 2018-09-25 09:27:35 +02:00
chylex 9c4a5e51de Fix Energy Oracle freaking out when held by the player model in a GUI 2018-09-25 09:00:06 +02:00
chylex a6375a36eb Refactor equality checks, fix imports, update BlockPos calls & ItemAncientCobweb 2018-09-25 08:34:52 +02:00
chylex 5db64b44c9 Add a custom falling block entity that crushes transparent blocks 2018-09-25 07:32:47 +02:00
chylex ee3f11e905 Refactor PosExt to return whether setters succeeded & add extensions 2018-09-25 07:29:17 +02:00
chylex 266ebe6beb Add EntityItemNoBob to simplify rendering items without bobbing 2018-09-24 13:54:37 +02:00
chylex aa1e75f40a Fix BlockPos.offsetUntil extension not using proper offset values 2018-09-24 13:29:07 +02:00
chylex 2f0e108aff Fix AI class names after intellij/kotlin stopped being weird 2018-09-24 13:27:03 +02:00
chylex a7d37192e0 Replace Silverfish and implement custom behavior, attributes, and drops 2018-09-24 10:00:54 +02:00
chylex 6bda95edde Add AI to hide in or spawn from blocks 2018-09-24 09:58:29 +02:00
chylex 36bf702fab Add custom targeting AI (random targeting, swarming multiple targets) 2018-09-24 09:26:23 +02:00
chylex 62d8b6212b Replace javaClass with ::class.java 2018-09-24 07:32:11 +02:00
chylex be4ae5fc9e Add AI utilities (custom base classes, constants, and class aliases) 2018-09-24 05:49:41 +02:00
chylex 5d22d72625 Allow passing class parameter to EntitySelector 2018-09-24 03:55:33 +02:00
chylex 356374f102 Fix formatting of 'return if' statements 2018-09-23 08:05:10 +02:00
chylex ac2acf7a53 Add loot condition for critical kills & simplify entity loot table registration 2018-09-23 05:24:18 +02:00
chylex 4147a71f03 Fix package name (game.entity.utils -> game.entity.util) 2018-09-22 20:38:52 +02:00
chylex e24c1ed4d4 Fix incorrect entity name formatting 2018-09-22 20:31:41 +02:00
chylex f9c9791dff Tweak damage classes (grouped protection modifiers, return if damage succeeded) 2018-09-22 20:16:20 +02:00
chylex 890e4b4f1b Add Dry Vine 2018-09-22 07:38:09 +02:00
chylex 5bc27f7c0e Allow generics in ItemBlock registration code 2018-09-22 07:36:36 +02:00
chylex fa3e3c4038 Update existing code to use new utilities & fix missing Spatial Dash Gem name 2018-09-22 03:53:56 +02:00
chylex fcae53a3c7 Add a Teleporter class to simplify teleportation code 2018-09-22 03:53:02 +02:00
chylex 7544bc454c Replace Chorus Flower, Plant, and Fruit, and implement custom drops and behavior 2018-09-22 01:35:48 +02:00
chylex a39395f70e Add extensions (BlockPos, iterable Facing) & refactor block/item registration code 2018-09-22 01:32:40 +02:00
chylex aef3147d79 Add Humus block w/ special planting and harvesting behavior 2018-09-21 06:33:09 +02:00
chylex 4fff20c966 Minor tweaks (add comments, update existing code to use getMaterial) 2018-09-20 15:08:07 +02:00
chylex a94ca2b2e0 Add Spatial Dash Gem w/ recipe and basic behavior 2018-09-20 15:07:30 +02:00
chylex fb76cb0997 Add a class to simplify storing UUID and retrieving the Entity 2018-09-20 14:56:49 +02:00
chylex 8878370758 Add a few extensions and utilities (math, BlockPos, BlockEditor, NBT) 2018-09-20 11:35:49 +02:00
chylex 67f27568f1 Add Static Core w/ recipe 2018-09-18 19:32:01 +02:00
chylex 0c4ff9c07b Add Energy Oracle w/ animated texture, recipe, and basic behavior 2018-09-18 00:00:55 +02:00
chylex e64719a13c Rewrite class for color transitions to improve queueing 2018-09-17 23:50:46 +02:00
chylex 9a19329e82 Rewrite ItemBaseEnergyUser to allow calculating Energy capacity and usage from NBT 2018-09-16 18:51:51 +02:00
chylex a7b40cfb56 Add ColorTransitionQueue for smooth client-side color transitions 2018-09-16 18:48:06 +02:00
chylex 2737681ab0 Convert HCL chroma and luminance to floats 2018-09-16 13:07:28 +02:00
chylex b43949a5dc Add vector and angle extensions 2018-09-16 13:06:37 +02:00
chylex d7273e2195 Why the hell is Kotlin exposing const vals of private companion objects 2018-09-15 19:39:52 +02:00
chylex 70510c3341 Minor formatting and annotation fixes 2018-09-15 13:08:29 +02:00
chylex b30fdcdf90 Implement WIP Igneous Rock entity burning and block smelting behavior 2018-09-15 13:06:01 +02:00
chylex ac6d8dd9b0 Add BlockPos extensions (new constructor, getFaceShape, offsetUntil) 2018-09-15 13:02:15 +02:00
chylex ace6f1b6b5 Add extension method to generate random vector 2018-09-15 13:01:00 +02:00
chylex 167465faad Add EntitySelector with several utility extension 2018-09-14 20:47:45 +02:00
chylex 134eb4e717 Change FIRE_TYPE damage to use ticks & update Igneous Rock Ore damage properties 2018-09-14 15:52:42 +02:00
chylex 2b799d1df8 Add Entity.setFireTicks extension & update EntityItem.cloneFrom to use AT 2018-09-14 15:51:12 +02:00
chylex 2fb8bef8c9 Add AT for 'fire' and 'pickupDelay' 2018-09-14 15:49:27 +02:00
chylex 4c2feacd29 Stop importing 'T' and fucking up generics, intellij 2018-09-14 13:07:18 +02:00
chylex 32fda32262 Simplify tile entity renderer registration code 2018-09-14 11:26:49 +02:00
chylex 2a5ff0d722 Add item entity for Igneous Rock w/ custom movement, lifespan, and rendering 2018-09-14 11:20:35 +02:00
chylex ec6c103813 Add entity utilities (extension methods and EntityItem renderer with no bobbing) 2018-09-14 11:09:24 +02:00
chylex 56f96c264e Add class with renderer factories 2018-09-14 11:06:54 +02:00
chylex 3088fa00af Move packet constructors and GUI factory to a different package 2018-09-13 16:57:00 +02:00
chylex 80155570e7 Refactor entity registration code 2018-09-13 16:56:27 +02:00
chylex 5b88697567 Add Igneous Rock Ore & Igneous Rock (WIP) 2018-09-13 12:37:17 +02:00
chylex 69bbceec40 Add Stardust Ore w/ drop table 2018-09-12 23:06:56 +02:00
chylex 68417a08a6 Add a base model for cubes with an overlay on each side & fix some formatting 2018-09-12 21:56:48 +02:00
chylex 75a08e846e Add a utility function to generate random numbers with bias 2018-09-12 21:55:42 +02:00
chylex e58cf55e12 Tweak Void Essence texture 2018-09-12 17:12:02 +02:00
chylex 6e51398da6 Add Vantablock w/ recipe 2018-09-12 17:04:27 +02:00
chylex d961392f87 Add resource items (Puzzle Medallion, Infernium, Auricion, Dragon Scale) 2018-09-12 14:48:30 +02:00
chylex 18aa107a52 Implement Energy Receptacle infusions 2018-09-11 13:43:57 +02:00
chylex aba96a917c Remove potentially confusing InfusionTag overloads 2018-09-11 13:39:50 +02:00
chylex 6e8d3d306f Implement a basic infusion system (serialization, item tooltip) 2018-09-11 12:15:15 +02:00
chylex 1d3520c3a1 Add an empty iterator object 2018-09-11 12:09:40 +02:00
chylex 2b8ba1bebb Add NBTEnumList to NBT extensions 2018-09-11 12:09:23 +02:00
chylex 85b4d2e81a Fix missing space before colon in generics 2018-09-11 00:02:53 +02:00
chylex b62f45fc70 Add Energy Cluster property generators for Overworld structures 2018-09-10 17:58:42 +02:00
chylex c8379d86ca Add a base generator for Energy Cluster properties and color 2018-09-10 15:37:45 +02:00
chylex 998b94bc5b Move the 'chylex.hee.render' to 'chylex.hee.game.render' 2018-09-10 14:57:45 +02:00
chylex 0a8d7f84da Add RandomExt.nextLong and WeightedList 2018-09-10 13:33:41 +02:00
chylex e78c0bfbb8 Display Cluster color in Energy Receptacle 2018-09-10 09:25:32 +02:00
chylex 9614fe7d46 Add Energy Cluster color 2018-09-10 09:23:42 +02:00
chylex 4a7b9acdb8 Add Energy Receptacle w/ recipe and WIP texture 2018-09-09 19:42:30 +02:00
chylex b4990cd6e4 Rework Energy Cluster serialization to simplify handling Cluster data 2018-09-09 17:17:47 +02:00
chylex 60ce0b5332 Move Energy quantity string conversion & tweak Energy item tooltips 2018-09-09 16:46:45 +02:00
chylex 187d27d3fd Add a method to deteriorate Energy Cluster's health 2018-09-09 15:56:14 +02:00
chylex 0032321015 Add utilities for block placement 2018-09-09 13:24:28 +02:00
chylex d9cdd61515 Fix wrong NBT calls in TileEntityEnergyCluster & use constants for keys 2018-09-08 22:24:51 +02:00
chylex be9e6d6eb6 Fix death messages with custom damage system 2018-09-08 19:31:29 +02:00
chylex 421a707252 Implement damage modifiers that modify invincibility frames 2018-09-08 15:15:38 +02:00
chylex 241b6e4ae5 Move some stuff around in IDamageProcessor 2018-09-08 15:06:10 +02:00
chylex b772ae3ba8 Implement damage types & enchantment protection handling 2018-09-08 14:52:47 +02:00
chylex 406166b9f4 Implement damage modifiers for armor, shields, and status effects 2018-09-08 13:25:16 +02:00
chylex bd04429a01 Implement difficulty/gamemode damage modifiers 2018-09-08 11:41:20 +02:00
chylex 479815d194 Maximize client/server window when debugging 2018-09-08 11:21:11 +02:00
chylex a47db662bc Begin implementing a custom damage system 2018-09-08 09:38:12 +02:00
chylex 02366154b2 Fix a duplicate client-side NBT call in TileEntityBase 2018-09-06 21:34:32 +02:00
chylex 75bd585153 Replace vanilla End Portal & implement custom charging mechanic and animation 2018-09-06 21:16:43 +02:00
chylex 092617dc3d Add base classes and block builders for custom portals & update rendering 2018-09-06 19:56:24 +02:00
chylex bc5f22fb86 Add LerpedFloat & LerpedDouble to simplify partial tick handling 2018-09-06 19:40:24 +02:00
chylex 22d3c6102c Add a utility method to find the closest tile entity to a block 2018-09-06 19:40:16 +02:00
chylex 626e862684 More minor refactoring (mostly verbosity reduction) 2018-09-06 12:46:49 +02:00
chylex 4c5a9ac009 Add an overridable firstTick method to TileEntityBase 2018-09-06 11:07:59 +02:00
chylex fc09e69ae2 Set a client username to keep advancements and statistics 2018-09-06 08:30:11 +02:00
chylex 2263a093e1 Fix custom transparent material to prevent Energy Clusters from exploding on right-click 2018-09-06 08:29:27 +02:00
chylex f70af2a608 Use block builder for Energy Cluster & enable mining stats 2018-09-06 08:07:22 +02:00
chylex 2d106a9d53 Add miningStats property to block builder & add BlockSimpleShaped 2018-09-06 08:03:31 +02:00
chylex 292b023f62 Very minor refactoring (parameter nullability) 2018-09-06 07:37:58 +02:00
chylex 2affe45fb9 Minor formatting fixes 2018-09-05 21:25:57 +02:00
chylex 9cd2e0363c Add a utility method to override vanilla blocks 2018-09-05 20:30:59 +02:00
chylex 884996927c Minor fix to explosion resistance for indestructible blocks 2018-09-05 20:14:51 +02:00
chylex 6b3b88ab2d Rewrite End Portal rendering to look like before Mojang fucked it up 2018-09-05 19:17:30 +02:00
chylex db7df5388e Add minor math & GL utilities 2018-09-05 18:23:41 +02:00
chylex c6474f0f33 Add End Stone variations 2018-09-05 09:58:51 +02:00
chylex 405cadb80a Optimize Obsidian textures 2018-09-05 08:22:46 +02:00
chylex 3cb7265776 Replace Ender Chest recipe 2018-09-05 07:50:21 +02:00
chylex 6a695aa713 Add Obsidian blocks (Stairs, Smooth, Chiseled, Pillar) & items (Fragment, Rod) w/ recipes 2018-09-05 06:49:03 +02:00
chylex c1e17415d1 Fix recipe issues (wrong file names & missing grouping for Endium Ingot and Gloomrock) 2018-09-05 06:38:44 +02:00
chylex e4b3ecdf0d Add base class for pillar blocks 2018-09-05 06:23:43 +02:00
chylex c49df03491 Fix issues with explosion resistance calculations 2018-09-05 06:08:54 +02:00
chylex a0f5ec6bd0 Add a few ore blocks (End Powder Ore, Endium Ore) 2018-09-04 18:00:41 +02:00
chylex 6ca0e9e13d Simplify loot table registration 2018-09-04 17:22:16 +02:00
chylex 9f995f050f Implement modifications to vanilla blocks (End Stone Bricks, Purpur Block, End Rod) 2018-09-04 16:17:10 +02:00
chylex 19ad33e2b8 Add a class for data integrity checking after the game loads 2018-09-04 16:14:04 +02:00
chylex 07395fcfe1 Convert block json files to forge blockstate format 2018-09-04 15:07:56 +02:00
chylex 8fe36fd557 Add forge blockstate json generators 2018-09-04 15:03:05 +02:00
chylex f523928917 Add Endium block and items w/ conversion recipes 2018-09-04 07:55:43 +02:00
chylex acb3eb0b37 Allow extending BlockSimple & minor tweak to ItemBlock registration and a comment 2018-09-04 07:28:33 +02:00
chylex eeeb4ea50a Add a few resource items (End Powder, Stardust, Void Essence) 2018-09-04 06:04:59 +02:00
chylex 5e4ea03910 Forgot to initialize custom loot 2018-09-04 02:54:14 +02:00
chylex cfe34ad483 Add Ancient Cobweb 2018-09-04 02:53:41 +02:00
chylex 426d405df7 Adapt vanilla loot system to block drops w/ Fortune condition 2018-09-03 18:15:25 +02:00
chylex 0b64683f52 Add base class for Energy-containing items & implement charging 2018-09-03 13:17:53 +02:00
chylex d235db2b7c Fix Energy Clusters overflowing during regeneration 2018-09-03 12:52:36 +02:00
chylex 342e3c4cc8 Add a text overlay when looking at Energy Clusters 2018-09-03 10:35:59 +02:00
chylex b5bfa36f0c Implement several basic Energy Cluster features (regeneration, health, inactivity, WIP breaking) 2018-09-03 09:11:34 +02:00
chylex 4409dd1491 Add a few extensions to PosExt & RandomExt 2018-09-03 07:33:54 +02:00
chylex e4911d66e8 Update NBT extensions with a property to create & retrieve a HEE specific tag 2018-09-03 06:38:31 +02:00
chylex a2e501e69e Add scalar multiplication to IEnergyQuantity w/ updated unit tests 2018-09-03 04:53:20 +02:00
chylex eda7af0ccf Add IEnergyQuantity for different representations of Energy amounts w/ unit tests 2018-09-03 03:31:16 +02:00
chylex 8b289283e9 Update TileEntityBase to use the new BlockPos extensions and constants 2018-09-03 00:14:29 +02:00
chylex 3b64d64ce4 Add BlockPos extensions 2018-09-03 00:04:51 +02:00
chylex 75905303b4 Add base material and classes for Energy Clusters 2018-09-02 14:03:31 +02:00
chylex 0d21e12ad0 Minor refactorings (block materials, exception messages, math extension use) 2018-08-29 16:18:53 +02:00
chylex bf85417659 Move from Trove to fastutil 2018-08-29 07:25:54 +02:00
chylex c7cc9b762a Add TileEntityBase with simple NBT synchronization 2018-08-29 06:59:30 +02:00
chylex 52bd97a96d Add setEnum/getEnum to NBT extensions 2018-08-29 06:56:54 +02:00
chylex da17bda84d Add color utilities (RGB & HCL/CIELCH conversion) 2018-08-29 06:38:12 +02:00
chylex cac8a624ae Add a custom material builder & some basic materials 2018-08-28 05:07:32 +02:00
chylex 4e9fba3d1c Fix explosion resistance in BlockSimple not matching vanilla values 2018-08-28 04:00:53 +02:00
chylex 3ec3714978 Add NBT extensions for ItemStacks and lists w/ unit tests 2018-08-28 03:06:07 +02:00
chylex bd2f643740 Add JUnit reference & update run configurations 2018-08-27 19:34:41 +02:00
chylex c5811a1816 Add an update WIP extension methods (Math, EnumFacing) 2018-08-27 18:36:02 +02:00
chylex 5ed9954360 Optimize PNG files 2018-08-26 21:19:30 +02:00
chylex 2582e0b3ac Register item models automatically because I can't be bothered 2018-08-26 21:07:35 +02:00
chylex 2d17bfbf9a Update build.gradle (kotlin version & minor tweaks) 2018-08-26 20:23:08 +02:00
chylex a308f0d66f Add Stone Brick Wall w/ recipe 2018-08-26 17:16:53 +02:00
chylex 238ad265b9 Add recipes for Gloomrock 2018-08-26 16:34:38 +02:00
chylex f3bfa5cc88 Add ModRecipes 2018-08-26 15:58:41 +02:00
chylex 99acb1e5ca Ensure block and item order in creative tab 2018-08-26 15:43:18 +02:00
chylex 7db613f2b7 Add Gloomrock & variations 2018-08-26 14:53:07 +02:00
chylex b3ecb70643 Add a base class and json generator for stairs 2018-08-26 14:30:34 +02:00
chylex 8df0ac29ee Fix error in BlockSlabCustom & use the property builder 2018-08-26 14:00:35 +02:00
chylex 556870311d Prepare block and model registration code w/ property builder 2018-08-26 13:55:39 +02:00
chylex 1cbf8730e4 Add a base class and json generator for slabs 2018-08-26 11:56:02 +02:00
chylex df1995428e Add scripts to simplify block and item json generation 2018-08-25 18:30:41 +02:00
chylex 9d87e196ba Add a recipe for Alteration Nexus 2018-08-25 15:54:07 +02:00
chylex 05d9de3ff5 Add a few resource items & update creative tab icon
Items: Ethereum, Ancient Dust, Alteration Nexus
2018-08-25 15:45:13 +02:00
chylex 51eb529157 Prepare item and model registration code 2018-08-25 15:18:41 +02:00
chylex 2d7d9f182a Add a creative tab 2018-08-25 14:19:36 +02:00
chylex 7fb26db4f4 Refactor ModConfig for better categorization of options 2018-03-25 18:25:40 +02:00
chylex 9605219761 Add a WIP client command '/hee version' 2018-03-25 17:21:52 +02:00
chylex 47d00e2c91 Add a debug command '/hee testworld' 2018-03-24 09:56:20 +01:00
chylex 52018f3c53 Add registry handlers for blocks, items, and entities 2018-03-24 09:44:53 +01:00
chylex 890850763b Move ModPackets and make it safer 2018-03-24 07:20:53 +01:00
chylex c6ded167cd Add a networking system 2018-03-23 17:36:10 +01:00
chylex 1f878d8edb Add import exclusion rules and fix warnings 2018-03-22 11:17:30 +01:00
chylex 5a5e347de0 Cleanup code and formatting of help command 2018-03-22 09:52:03 +01:00
chylex 1893f1bd94 Implement an interactive help command 2018-03-22 07:34:19 +01:00
chylex 05d8c21227 Add a subcommand system and support for debug-only commands 2018-03-21 05:19:48 +01:00
chylex dd22239f1c Add a basic client/server command system 2018-03-21 01:38:10 +01:00
chylex 15f7f78d69 Add debug mode triggered by a custom VM argument 2018-03-20 23:59:17 +01:00
chylex 27c6d533f0 Push run configurations 2018-03-20 23:32:10 +01:00
chylex 28e897cdfd Update annotation settings 2018-03-20 23:03:37 +01:00
chylex 7be4cff5ef Add a basic proxy object 2018-03-20 21:09:10 +01:00
chylex 074ba8e881 Add extension methods for Random 2018-03-20 09:21:00 +01:00
chylex cedb89d3c2 Store version in main class and add a network check 2018-03-20 08:27:16 +01:00
chylex 2227eee3dd Fix Kotlin to target JVM 1.8 and ignore NetworkCheckHandler warnings 2018-03-17 20:35:29 +01:00
chylex d15538aaa6 Merge branch 'master' of https://github.com/chylex/Hardcore-Ender-Expansion-2 2018-03-15 22:53:16 +01:00
chylex d9c6f75dcb Add a test config file 2018-03-15 22:18:58 +01:00
chylex 433a137fed Add log to main class and fix formatting 2018-03-15 22:13:15 +01:00
chylexandGitHub a667d08b9c Add a readme file 2018-03-02 08:15:39 +01:00
chylex 95af2c14fc Update Kotlin version and modules.xml 2018-03-02 08:11:32 +01:00
chylex 23372bd45d Let's Go! I mean, Kotlin 2018-01-29 13:32:58 +01:00
chylex 0af463f98c Push gitignore and workspace settings 2018-01-29 13:11:52 +01:00
chylex 4e4ffa01ea Gradle 2018-01-29 09:24:19 +01:00
1518 changed files with 61477 additions and 418 deletions
-1
View File
@@ -1 +0,0 @@
* text=auto eol=lf
+22 -9
View File
@@ -1,15 +1,28 @@
# IntelliJ
/.idea/
*.iml
# idea
out
*.ipr
*.iws
*.iml
# Gradle
.idea/gradle.xml
.idea/tasks.xml
.idea/workspace.xml
.gradle/
build/
.idea/codeStyles
.idea/libraries
# Game
# eclipse
bin
*.launch
.settings
.metadata
.classpath
.project
/run/
# gradle
build
.gradle
# game
run/*
!run/*.ps1
+40
View File
@@ -0,0 +1,40 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="JavaProjectCodeInsightSettings">
<excluded-names>
<name>akka</name>
<name>com.ibm</name>
<name>com.sun</name>
<name>java.awt</name>
<name>java.beans</name>
<name>java.rmi</name>
<name>javafx</name>
<name>javax.rmi</name>
<name>javax.swing</name>
<name>javax.xml</name>
<name>jdk.internal</name>
<name>net.java.games.input.Component.Identifier.Key</name>
<name>net.minecraft.init.Blocks</name>
<name>net.minecraft.init.Items</name>
<name>net.minecraft.init.MobEffects</name>
<name>net.minecraft.init.PotionTypes</name>
<name>net.minecraft.init.SoundEvents</name>
<name>net.minecraft.util.EnumActionResult</name>
<name>net.minecraft.util.EnumFacing</name>
<name>net.minecraft.util.EnumHand</name>
<name>net.minecraft.world.EnumDifficulty</name>
<name>net.minecraftforge.fml.common.Mod.EventBusSubscriber</name>
<name>net.minecraftforge.fml.common.eventhandler.Event</name>
<name>net.minecraftforge.fml.common.eventhandler.EventPriority</name>
<name>net.minecraftforge.fml.common.eventhandler.SubscribeEvent</name>
<name>net.minecraftforge.fml.relauncher.Side</name>
<name>net.minecraftforge.fml.relauncher.SideOnly</name>
<name>org.ietf</name>
<name>org.omg</name>
<name>org.w3c</name>
<name>org.xml</name>
<name>scala</name>
<name>sun</name>
</excluded-names>
</component>
</project>
+10
View File
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="1.8">
<module name="Hardcore-Ender-Expansion-2.api" target="1.8" />
<module name="Hardcore-Ender-Expansion-2.main" target="1.8" />
<module name="Hardcore-Ender-Expansion-2.test" target="1.8" />
</bytecodeTargetLevel>
</component>
</project>
+6
View File
@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" defaultCharsetForPropertiesFiles="UTF-8">
<file url="PROJECT" charset="UTF-8" />
</component>
</project>
+22
View File
@@ -0,0 +1,22 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="CascadeIf" enabled="false" level="INFO" enabled_by_default="false" />
<inspection_tool class="ClassName" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="namePattern" value="[A-Z][_A-Za-z\d]*" />
</inspection_tool>
<inspection_tool class="FoldInitializerAndIfToElvis" enabled="false" level="INFO" enabled_by_default="false" />
<inspection_tool class="FunctionName" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<option name="namePattern" value="([A-Za-z][A-Za-z\d]*)|([A-Z][_A-Z\d]*)" />
</inspection_tool>
<inspection_tool class="RedundantSuppression" enabled="true" level="WARNING" enabled_by_default="true">
<option name="IGNORE_ALL" value="true" />
</inspection_tool>
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
<option name="processCode" value="true" />
<option name="processLiterals" value="true" />
<option name="processComments" value="true" />
</inspection_tool>
<inspection_tool class="UnusedProperty" enabled="false" level="WARNING" enabled_by_default="false" />
</profile>
</component>
+10
View File
@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Kotlin2JsCompilerArguments">
<option name="sourceMapEmbedSources" />
<option name="sourceMapPrefix" />
</component>
<component name="Kotlin2JvmCompilerArguments">
<option name="jvmTarget" value="1.8" />
</component>
</project>
+41
View File
@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="EntryPointsManager">
<list size="6">
<item index="0" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.Mod" />
<item index="1" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.Mod.EventBusSubscriber" />
<item index="2" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.Mod.EventHandler" />
<item index="3" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.eventhandler.SubscribeEvent" />
<item index="4" class="java.lang.String" itemvalue="net.minecraftforge.fml.common.network.NetworkCheckHandler" />
<item index="5" class="java.lang.String" itemvalue="net.minecraftforge.fml.relauncher.IFMLLoadingPlugin.Name" />
</list>
</component>
<component name="NullableNotNullManager">
<option name="myDefaultNullable" value="javax.annotation.Nullable" />
<option name="myDefaultNotNull" value="javax.annotation.Nonnull" />
<option name="myNullables">
<value>
<list size="5">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.Nullable" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nullable" />
<item index="2" class="java.lang.String" itemvalue="javax.annotation.CheckForNull" />
<item index="3" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.Nullable" />
<item index="4" class="java.lang.String" itemvalue="android.support.annotation.Nullable" />
</list>
</value>
</option>
<option name="myNotNulls">
<value>
<list size="4">
<item index="0" class="java.lang.String" itemvalue="org.jetbrains.annotations.NotNull" />
<item index="1" class="java.lang.String" itemvalue="javax.annotation.Nonnull" />
<item index="2" class="java.lang.String" itemvalue="edu.umd.cs.findbugs.annotations.NonNull" />
<item index="3" class="java.lang.String" itemvalue="android.support.annotation.NonNull" />
</list>
</value>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="false" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/bin" />
</component>
</project>
+11
View File
@@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.iml" filepath="$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.api.iml" filepath="$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.api.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.main.iml" filepath="$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.main.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.test.iml" filepath="$PROJECT_DIR$/.idea/modules/Hardcore-Ender-Expansion-2.test.iml" />
</modules>
</component>
</project>
+15
View File
@@ -0,0 +1,15 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Minecraft Client" type="Application" factoryName="Application" singleton="true">
<option name="MAIN_CLASS_NAME" value="GradleStart" />
<module name="Hardcore-Ender-Expansion-2.main" />
<option name="PROGRAM_PARAMETERS" value="--username Player" />
<option name="VM_PARAMETERS" value="-Dhee.debug -Dfml.coreMods.load=chylex.hee.system.core.CoremodPlugin -XX:HotswapDeoptClassPath='chylex.,net.,com.sun.proxy.$Proxy,sun.reflect.Generated'" />
<option name="WORKING_DIRECTORY" value="./run" />
<extension enabled="false" name="coverage" runner="idea" sample_coverage="true" />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
+14
View File
@@ -0,0 +1,14 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Minecraft Server" type="Application" factoryName="Application" singleton="true">
<option name="MAIN_CLASS_NAME" value="GradleStartServer" />
<module name="Hardcore-Ender-Expansion-2.main" />
<option name="VM_PARAMETERS" value="-Dhee.debug -Dfml.coreMods.load=chylex.hee.system.core.CoremodPlugin -XX:HotswapDeoptClassPath='chylex.,net.,com.sun.proxy.$Proxy,sun.reflect.Generated'" />
<option name="WORKING_DIRECTORY" value="./run" />
<extension enabled="false" name="coverage" runner="idea" sample_coverage="true" />
<RunnerSettings RunnerId="Run" />
<ConfigurationWrapper RunnerId="Run" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
+14
View File
@@ -0,0 +1,14 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="Unit Tests" type="JUnit" factoryName="JUnit" singleton="true">
<module name="Hardcore-Ender-Expansion-2_test" />
<option name="PACKAGE_NAME" value="chylex.hee.test" />
<option name="MAIN_CLASS_NAME" value="" />
<option name="METHOD_NAME" value="" />
<option name="TEST_OBJECT" value="package" />
<option name="PARAMETERS" value="" />
<option name="WORKING_DIRECTORY" value="./run" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
+18
View File
@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Statistic">
<option name="fileTypes" value="cfg;info;md" />
<option name="separateTabsFileTypes" value="java;json;kt;lang;mcmeta;py" />
<option name="excludedDirectories">
<list>
<option value="$PROJECT_DIR$/.gradle" />
<option value="$PROJECT_DIR$/gradle" />
<option value="$PROJECT_DIR$/.idea" />
<option value="$PROJECT_DIR$/run" />
<option value="$PROJECT_DIR$/bin" />
<option value="$PROJECT_DIR$/assets" />
<option value="$PROJECT_DIR$/build" />
</list>
</option>
</component>
</project>
-1
View File
@@ -1,3 +1,2 @@
# Hardcore Ender Expansion 2
Work in progress. PRs will not be accepted before release.
Binary file not shown.
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
{"meta":{"format_version":"3.0","model_format":"modded_entity","box_uv":true},"name":"ender_eye","geo_name":"EnderEye","resolution":{"width":128,"height":64},"elements":[{"name":"head","from":[-9,0,-9],"to":[9,18,9],"autouv":0,"color":6,"origin":[0,0.5,0],"uuid":"fb9acb7e-e386-2daf-51e7-e487f7edb51e"},{"name":"eye","from":[-8,1,-9],"to":[8,17,-8],"autouv":0,"color":5,"origin":[0,0,0],"uv_offset":[15,47],"uuid":"0f34925f-0ce7-73d1-b6bc-3ebc6b954619"},{"name":"left","from":[9,-17,-2],"to":[12,10,1],"autouv":0,"color":3,"origin":[0,0,0],"uv_offset":[73,0],"uuid":"683a14b0-c7d3-ee33-e790-ec456d2eafa1"},{"name":"right","from":[-12,-17,-2],"to":[-9,10,1],"autouv":0,"color":6,"shade":false,"origin":[0,0,0],"uv_offset":[73,0],"uuid":"edc957d9-62dd-52d4-82a3-9db5f0f81fee"}],"outliner":[{"name":"head","uuid":"2a0767df-d550-08ea-5bef-585cc941b58f","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,9,0],"children":["fb9acb7e-e386-2daf-51e7-e487f7edb51e"]},{"name":"eye","uuid":"3ed25df7-6cab-0a5f-3900-39521430d664","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,9,0],"children":["0f34925f-0ce7-73d1-b6bc-3ebc6b954619"]},{"name":"arms","uuid":"50918f7b-a888-8c07-5851-72c157cac008","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,8.5,-0.5],"children":["683a14b0-c7d3-ee33-e790-ec456d2eafa1","edc957d9-62dd-52d4-82a3-9db5f0f81fee"]}],"textures":[{"path":"C:\\Dan\\Projekty\\Hardcore-Ender-Expansion-2\\src\\main\\resources\\assets\\hee\\textures\\entity\\ender_eye.png","name":"ender_eye.png","folder":"entity","namespace":"hee","id":"0","particle":false,"mode":"link","saved":true,"uuid":"43e48689-95e3-8430-06f8-1c61b6f96c9d"}]}
Binary file not shown.
Binary file not shown.
+1
View File
@@ -0,0 +1 @@
{"meta":{"format_version":"3.0","model_format":"modded_entity","box_uv":true},"name":"IgneousPlate","geo_name":"IgneousPlate","resolution":{"width":32,"height":16},"elements":[{"name":"cube","from":[-14,-12,0],"to":[-12,-4,2],"autouv":0,"color":3,"origin":[3.5,8,1],"uv_offset":[0,6],"uuid":"90291b85-56cc-94f2-58ac-e37c867ac90a"},{"name":"cube","from":[-4,-12,0],"to":[-2,-4,2],"autouv":0,"color":1,"origin":[0,0,0],"uv_offset":[8,6],"uuid":"cf15a4d3-d9cb-be21-c49a-1e2cf8ba68e9"},{"name":"cube","from":[-14,-4,0],"to":[-2,-2,2],"autouv":0,"color":7,"origin":[0,0,0],"uuid":"5e21b956-681a-3556-7acd-a7098ee9fb5c"},{"name":"cube","from":[-14,-14,0],"to":[-2,-12,2],"autouv":0,"color":4,"origin":[0,0,0],"uv_offset":[0,4],"uuid":"e944760c-3ee1-ca95-0a38-f470471948ba"},{"name":"cube","from":[-12,-12,0.5],"to":[-4,-4,1.5],"autouv":0,"color":3,"origin":[0,0,0],"uv_offset":[14,7],"uuid":"0566d9d0-a1b5-e435-e234-caa759b3aec4"}],"outliner":[{"name":"outerBox","uuid":"a5f25de6-2619-4ae4-2de8-c1cdec9112b7","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,0,0],"children":["90291b85-56cc-94f2-58ac-e37c867ac90a","cf15a4d3-d9cb-be21-c49a-1e2cf8ba68e9","5e21b956-681a-3556-7acd-a7098ee9fb5c","e944760c-3ee1-ca95-0a38-f470471948ba"]},{"name":"innerBox","uuid":"62290e42-d30b-2154-940b-a50c3c127698","export":true,"isOpen":true,"visibility":true,"autouv":0,"origin":[0,0,0],"children":["0566d9d0-a1b5-e435-e234-caa759b3aec4"]}],"textures":[{"path":"C:\\Dan\\Projekty\\Hardcore-Ender-Expansion-2\\src\\main\\resources\\assets\\hee\\textures\\entity\\igneous_plate.png","name":"igneous_plate.png","folder":"entity","namespace":"hee","id":"0","particle":false,"mode":"link","saved":true,"uuid":"f1c8b220-6b45-6f19-175d-ba78fba868a3"}]}
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+78
View File
@@ -0,0 +1,78 @@
buildscript{
ext.kotlin_version = "1.3.40"
repositories{
jcenter()
mavenCentral()
maven{
url = "http://files.minecraftforge.net/maven"
}
}
dependencies{
classpath "net.minecraftforge.gradle:ForgeGradle:2.3-SNAPSHOT"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlin_version}"
}
}
apply plugin: "net.minecraftforge.gradle.forge"
apply plugin: "kotlin"
sourceCompatibility = targetCompatibility = "1.8"
tasks.withType(JavaCompile){
sourceCompatibility = targetCompatibility = "1.8"
}
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile){
kotlinOptions{
jvmTarget = "1.8"
apiVersion = "1.3"
languageVersion = "1.3"
freeCompilerArgs = [
"-Xno-call-assertions",
"-Xno-param-assertions",
"-Xno-receiver-assertions",
"-Xjvm-default=enable",
"-Xuse-experimental=kotlin.ExperimentalUnsignedTypes",
"-Xuse-experimental=kotlin.contracts.ExperimentalContracts",
"-XXLanguage:+InlineClasses"
]
}
}
minecraft{
version = "1.12.2-14.23.5.2768"
runDir = "run"
mappings = "stable_39"
makeObfSourceJar = false
}
dependencies{
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
compile "org.jetbrains.kotlin:kotlin-reflect"
testCompile "org.junit.jupiter:junit-jupiter-api:5.3.0-RC1"
}
test{
systemProperty "junit.jupiter.testinstance.lifecycle.default", "per_class"
}
def modinfo = null
processResources{
File file = new File(++sourceSets.main.resources.srcDirs.iterator(), "mcmod.info")
modinfo = new groovy.json.JsonSlurper().parseText(file.getText())[0]
rename("hee_at.cfg", "META-INF/hee_at.cfg")
}
jar{
archiveName = "HardcoreEnderExpansion MC-${project.minecraft.version} v${modinfo.version}.jar"
manifest{
attributes "FMLAT": "hee_at.cfg"
}
}
-110
View File
@@ -1,110 +0,0 @@
val javaVersion: String by project
val minecraftVersion: String by project
val parchmentVersion: String by project
val kotlinForForgeVersion: String by project
val neoForgeVersion: String by project
val minecraftVersionRange: String by project
val neoForgeVersionRange: String by project
val kotlinForForgeVersionRange: String by project
plugins {
idea
kotlin("jvm") version "1.9.23"
id("net.neoforged.moddev") version "1.0.10" // https://projects.neoforged.net/neoforged/ModDevGradle
}
idea {
module {
excludeDirs.add(file("gradle"))
excludeDirs.add(file("run"))
isDownloadSources = true
isDownloadJavadoc = true
}
}
repositories {
maven(url = "https://thedarkcolour.github.io/KotlinForForge") {
name = "KotlinForForge"
content { includeGroup("thedarkcolour") }
}
}
java {
toolchain {
languageVersion.set(JavaLanguageVersion.of(javaVersion))
}
manifest {
attributes(
"Specification-Title" to "hee",
"Specification-Vendor" to "chylex",
"Specification-Version" to "0",
"Implementation-Title" to "Hardcore-Ender-Expansion-2",
"Implementation-Vendor" to "chylex",
"Implementation-Version" to version,
)
}
}
neoForge {
version = neoForgeVersion
parchment.minecraftVersion.set(minecraftVersion)
parchment.mappingsVersion.set(parchmentVersion)
runs {
configureEach {
gameDirectory.set(file("run"))
systemProperty("forge.logging.console.level", "debug")
}
register("client") {
ideName.set("Client")
client()
}
register("server") {
ideName.set("Server")
server()
}
register("data") {
ideName.set("Data")
data()
programArguments.apply {
add("--all")
addAll("--mod", "hee")
addAll("--existing", file("src/main/resources").absolutePath)
addAll("--output", file("src/generated/resources").absolutePath)
}
}
}
}
dependencies {
implementation("thedarkcolour:kotlinforforge-neoforge:$kotlinForForgeVersion")
}
tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
}
tasks.withType<AbstractArchiveTask>().configureEach {
isPreserveFileTimestamps = false
isReproducibleFileOrder = true
}
tasks.processResources {
inputs.property("version", version)
inputs.property("minecraftVersionRange", minecraftVersionRange)
inputs.property("neoForgeVersionRange", neoForgeVersionRange)
inputs.property("kotlinForForgeVersionRange", kotlinForForgeVersionRange)
filesMatching("META-INF/neoforge.mods.toml") {
expand(inputs.properties)
}
}
+2 -19
View File
@@ -1,20 +1,3 @@
# Mod
group=com.chylex.hee
version=2.0.0-dev
# Dependencies
javaVersion=21
minecraftVersion=1.21
parchmentVersion=2024.07.07
neoForgeVersion=21.0.96-beta
kotlinForForgeVersion=5.4.0
# Constraints
minecraftVersionRange=[1.21,)
neoForgeVersionRange=[21.0.96-beta,)
kotlinForForgeVersionRange=[5.4.0,)
# Gradle
# 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.caching=true
org.gradle.parallel=true
Binary file not shown.
+2 -3
View File
@@ -1,7 +1,6 @@
#Wed Oct 31 13:34:38 CET 2018
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.2-bin.zip
Vendored
+113 -198
View File
@@ -1,127 +1,78 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#!/usr/bin/env bash
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS=""
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
MAX_FD="maximum"
warn () {
warn ( ) {
echo "$*"
} >&2
}
die () {
die ( ) {
echo
echo "$*"
echo
exit 1
} >&2
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD=$JAVA_HOME/bin/java
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
@@ -130,120 +81,84 @@ Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin, switch paths to Windows format before running java
if $cygwin ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=$((i+1))
done
case $i in
(0) set -- ;;
(1) set -- "$args0" ;;
(2) set -- "$args0" "$args1" ;;
(3) set -- "$args0" "$args1" "$args2" ;;
(4) set -- "$args0" "$args1" "$args2" "$args3" ;;
(5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
(6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
(7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
(8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
(9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
function splitJvmOpts() {
JVM_OPTS=("$@")
}
eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
org.gradle.wrapper.GradleWrapperMain \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"
exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
Vendored
+40 -42
View File
@@ -1,20 +1,4 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%"=="" @echo off
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@@ -25,29 +9,25 @@
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
set DEFAULT_JVM_OPTS=
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
if "%ERRORLEVEL%" == "0" goto init
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
@@ -55,36 +35,54 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
if exist "%JAVA_EXE%" goto init
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
if "%@eval[2+2]" == "4" goto 4NT_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
goto execute
:4NT_args
@rem Get arguments from the 4NT Shell from JP Software
set CMD_LINE_ARGS=%$
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
+5
View File
@@ -0,0 +1,5 @@
Param([Parameter(Mandatory = $True, Position = 1)][string] $filePath)
Add-Type -AssemblyName System.Windows.Forms
$files = new-object System.Collections.Specialized.StringCollection
$files.Add($filePath)
[System.Windows.Forms.Clipboard]::SetFileDropList($files)
+3
View File
@@ -0,0 +1,3 @@
Param([Parameter(Mandatory = $True, Position = 1)][string] $processId)
Add-Type -MemberDefinition '[DllImport("user32.dll")]public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);' -Name Functions -Namespace Win32
[Win32.Functions]::ShowWindow((Get-Process -Id $processId).MainWindowHandle, 3)
-1
View File
@@ -1 +0,0 @@
rootProject.name = "hee"
+104
View File
@@ -0,0 +1,104 @@
package chylex.hee
import chylex.hee.game.block.util.CustomPlantType
import chylex.hee.game.commands.HeeServerCommand
import chylex.hee.game.entity.CustomCreatureType
import chylex.hee.game.entity.item.EntityItemIgneousRock
import chylex.hee.game.entity.living.EntityMobEnderman
import chylex.hee.game.entity.living.behavior.EndermanBlockHandler
import chylex.hee.game.item.util.CustomRarity
import chylex.hee.game.item.util.CustomToolMaterial
import chylex.hee.game.mechanics.causatum.EnderCausatum
import chylex.hee.game.mechanics.instability.Instability
import chylex.hee.game.mechanics.trinket.TrinketHandler
import chylex.hee.game.world.WorldProviderEndCustom
import chylex.hee.game.world.feature.OverworldFeatures
import chylex.hee.game.world.territory.storage.TokenPlayerStorage
import chylex.hee.init.ModCreativeTabs
import chylex.hee.init.ModGuiHandler
import chylex.hee.init.ModLoot
import chylex.hee.init.ModNetwork
import chylex.hee.init.ModPotions
import chylex.hee.init.ModRecipes
import chylex.hee.proxy.Environment
import chylex.hee.system.Debug
import chylex.hee.system.IntegrityCheck
import chylex.hee.system.migration.forge.Side
import net.minecraftforge.fml.common.Mod
import net.minecraftforge.fml.common.Mod.EventHandler
import net.minecraftforge.fml.common.event.FMLInitializationEvent
import net.minecraftforge.fml.common.event.FMLLoadCompleteEvent
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent
import net.minecraftforge.fml.common.event.FMLServerStartingEvent
import net.minecraftforge.fml.common.network.NetworkCheckHandler
import org.apache.logging.log4j.Logger
@Mod(modid = HEE.ID, useMetadata = true, modLanguageAdapter = "chylex.hee.system.core.KotlinAdapter")
object HEE{
const val ID = "hee"
const val DIM = 1
lateinit var log: Logger
lateinit var version: String
val proxy = Environment.constructProxy()
init{
CustomRarity
CustomToolMaterial
CustomCreatureType
CustomPlantType
}
@EventHandler
fun onPreInit(e: FMLPreInitializationEvent){
log = e.modLog
version = e.modMetadata.version
Debug.initialize()
ModNetwork.initialize()
ModGuiHandler.initialize()
ModCreativeTabs.initialize()
TrinketHandler.register()
EnderCausatum.register()
Instability.register()
TokenPlayerStorage.register()
WorldProviderEndCustom.register()
proxy.onPreInit()
}
@EventHandler
fun onInit(@Suppress("UNUSED_PARAMETER") e: FMLInitializationEvent){
ModLoot.initialize()
ModRecipes.initialize()
OverworldFeatures.register()
proxy.onInit()
}
@EventHandler
fun onPostInit(@Suppress("UNUSED_PARAMETER") e: FMLPostInitializationEvent){
CustomToolMaterial.setupRepairItems()
EntityItemIgneousRock.setupSmeltingTransformations()
EntityMobEnderman.setupBiomeSpawns()
EndermanBlockHandler.setupCarriableBlocks()
ModPotions.setupVanillaOverrides()
OverworldFeatures.setupVanillaOverrides()
}
@EventHandler
fun onLoadComplete(@Suppress("UNUSED_PARAMETER") e: FMLLoadCompleteEvent){
IntegrityCheck.verify()
}
@EventHandler
fun onServerStarting(e: FMLServerStartingEvent){
e.registerServerCommand(HeeServerCommand)
}
@NetworkCheckHandler
fun onNetworkCheck(mods: Map<String, String>, @Suppress("UNUSED_PARAMETER") side: Side): Boolean{
return mods.isNotEmpty() && mods[ID] == version
}
}
@@ -0,0 +1,30 @@
package chylex.hee.client.gui
import chylex.hee.client.gui.base.GuiBaseChestContainer
import chylex.hee.game.container.ContainerAmuletOfRecovery
import chylex.hee.network.server.PacketServerContainerEvent
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.gui.GuiButton
import net.minecraft.client.resources.I18n
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.util.EnumHand
import net.minecraftforge.fml.client.config.GuiButtonExt
@Sided(Side.CLIENT)
class GuiAmuletOfRecovery(player: EntityPlayer, itemHeldIn: EnumHand) : GuiBaseChestContainer(ContainerAmuletOfRecovery(player, itemHeldIn)){
override fun initGui(){
super.initGui()
val moveAllTitle = I18n.format("gui.hee.amulet_of_recovery.move_all")
val moveAllWidth = (fontRenderer.getStringWidth(moveAllTitle) + 14).coerceAtMost(xSize / 2)
buttonList.add(GuiButtonExt(1000, guiLeft + xSize - moveAllWidth - 7, (height / 2) + 6, moveAllWidth, 11, moveAllTitle))
}
override fun actionPerformed(button: GuiButton){
when(button.id){
1000 -> PacketServerContainerEvent(0).sendToServer()
else -> super.actionPerformed(button)
}
}
}
@@ -0,0 +1,68 @@
package chylex.hee.client.gui
import chylex.hee.client.render.util.GL
import chylex.hee.client.util.MC
import chylex.hee.game.block.entity.TileEntityBrewingStandCustom
import chylex.hee.game.container.ContainerBrewingStandCustom
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.getStack
import chylex.hee.system.util.isNotEmpty
import chylex.hee.system.util.totalTime
import net.minecraft.client.gui.inventory.GuiBrewingStand
import net.minecraft.entity.player.InventoryPlayer
@Sided(Side.CLIENT)
class GuiBrewingStandCustom(inventory: InventoryPlayer, private val brewingStand: TileEntityBrewingStandCustom) : GuiBrewingStand(inventory, brewingStand){
private companion object{
private val TEX_BACKGROUND = Resource.Custom("textures/gui/brewing_stand.png")
private val BUBBLE_LENGTHS = intArrayOf(0, 6, 11, 16, 20, 24, 29)
}
private var brewStartTime = brewingStand.world.totalTime
init{
inventorySlots = ContainerBrewingStandCustom(inventory, brewingStand)
}
override fun drawGuiContainerBackgroundLayer(partialTicks: Float, mouseX: Int, mouseY: Int){
val x = (width - xSize) / 2
val y = (height - ySize) / 2
GL.color(1F, 1F, 1F, 1F)
MC.textureManager.bindTexture(TEX_BACKGROUND)
drawTexturedModalRect(x, y, 0, 0, xSize, ySize)
val worldTime = brewingStand.world.totalTime
val brewTime = brewingStand.brewTime
if (brewTime > 0){
val brewProgress = (28F * (1F - (brewTime / 400F))).toInt()
if (brewProgress > 0){
drawTexturedModalRect(x + 97, y + 16, 176, 0, 9, brewProgress)
}
val bubbleLength = BUBBLE_LENGTHS[((worldTime - brewStartTime).toInt() / 2) % 7]
if (bubbleLength > 0){
drawTexturedModalRect(x + 63, y + 43 - bubbleLength, 185, 29 - bubbleLength, 12, bubbleLength)
}
}
else{
brewStartTime = worldTime
}
if (brewingStand.getStack(TileEntityBrewingStandCustom.SLOT_MODIFIER).isNotEmpty){
drawTexturedModalRect(x + 62, y + 45, 197, 0, 14, 2)
}
for(slotIndex in TileEntityBrewingStandCustom.SLOTS_POTIONS){
val slot = inventorySlots.getSlot(slotIndex)
if (!slot.hasStack){
drawTexturedModalRect(x + slot.xPos, y + slot.yPos, 211, 0, 16, 16)
}
}
}
}
@@ -0,0 +1,10 @@
package chylex.hee.client.gui
import chylex.hee.client.gui.base.GuiBaseChestContainer
import chylex.hee.game.block.entity.TileEntityLootChest
import chylex.hee.game.container.ContainerLootChest
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.entity.player.EntityPlayer
@Sided(Side.CLIENT)
class GuiLootChest(player: EntityPlayer, tile: TileEntityLootChest) : GuiBaseChestContainer(ContainerLootChest(player, tile))
@@ -0,0 +1,17 @@
package chylex.hee.client.gui
import chylex.hee.client.gui.base.GuiBaseChestContainer
import chylex.hee.game.block.entity.TileEntityVoidPortalStorage
import chylex.hee.game.container.ContainerPortalTokenStorage
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.any
import chylex.hee.system.util.nonEmptySlots
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.item.ItemStack
@Sided(Side.CLIENT)
class GuiPortalTokenStorage(player: EntityPlayer, tile: TileEntityVoidPortalStorage) : GuiBaseChestContainer(ContainerPortalTokenStorage(player, tile)){
fun canActivateToken(stack: ItemStack): Boolean{
return (inventorySlots as ContainerPortalTokenStorage).lowerChestInventory.nonEmptySlots.any { it.stack === stack }
}
}
@@ -0,0 +1,42 @@
package chylex.hee.client.gui
import chylex.hee.client.gui.base.GuiBaseCustomInventory
import chylex.hee.game.container.ContainerTrinketPouch
import chylex.hee.game.container.base.ContainerBaseCustomInventory
import chylex.hee.game.item.ItemTrinketPouch.Inventory
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.color.IntColor.Companion.RGBA
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.size
import net.minecraft.client.gui.Gui
import net.minecraft.entity.player.EntityPlayer
@Sided(Side.CLIENT)
class GuiTrinketPouch(player: EntityPlayer, inventorySlot: Int) : GuiBaseCustomInventory<Inventory>(ContainerTrinketPouch(player, inventorySlot)){
override val texBackground = Resource.Custom("textures/gui/trinket_pouch.png")
override val titleContainer = "gui.hee.trinket_pouch.title"
private val hiddenSlots: Int
private val hiddenSlotColor = RGBA(0u, 0.25F).i
init{
ySize = ContainerTrinketPouch.HEIGHT
hiddenSlots = ContainerTrinketPouch.MAX_SLOTS - (inventorySlots as ContainerBaseCustomInventory<*>).containerInventory.size
}
override fun drawGuiContainerBackgroundLayer(partialTicks: Float, mouseX: Int, mouseY: Int){
super.drawGuiContainerBackgroundLayer(partialTicks, mouseX, mouseY)
val middleSlot = ContainerTrinketPouch.MAX_SLOTS / 2
repeat(hiddenSlots){
renderSlotCover(middleSlot + ((ContainerTrinketPouch.MAX_SLOTS - it) / 2) * (if (it % 2 == 0) -1 else 1))
}
}
private fun renderSlotCover(index: Int){
val x = guiLeft + 44 + (index * 18)
val y = guiTop + 18
Gui.drawRect(x, y, x + 16, y + 16, hiddenSlotColor)
}
}
@@ -0,0 +1,49 @@
package chylex.hee.client.gui.base
import chylex.hee.client.render.util.GL
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.color.IntColor.Companion.RGB
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.size
import net.minecraft.client.gui.inventory.GuiContainer
import net.minecraft.inventory.ContainerChest
@Sided(Side.CLIENT)
abstract class GuiBaseChestContainer(container: ContainerChest) : GuiContainer(container){
private companion object{
private val TEX_BACKGROUND = Resource.Vanilla("textures/gui/container/generic_54.png")
private val COLOR_TEXT = RGB(64u).i
}
private val containerRows = container.lowerChestInventory.size / 9
private val titleContainer = container.lowerChestInventory.displayName.unformattedText
private val titleInventory = MC.player?.inventory?.displayName?.unformattedText ?: "" // 'mc' not initialized yet
init{
ySize = 114 + (containerRows * 18)
}
override fun drawScreen(mouseX: Int, mouseY: Int, partialTicks: Float){
drawDefaultBackground()
super.drawScreen(mouseX, mouseY, partialTicks)
renderHoveredToolTip(mouseX, mouseY)
}
override fun drawGuiContainerBackgroundLayer(partialTicks: Float, mouseX: Int, mouseY: Int){
val x = (width - xSize) / 2
val y = (height - ySize) / 2
val heightContainer = 17 + (containerRows * 18)
GL.color(1F, 1F, 1F, 1F)
mc.textureManager.bindTexture(TEX_BACKGROUND)
drawTexturedModalRect(x, y, 0, 0, xSize, heightContainer)
drawTexturedModalRect(x, y + heightContainer, 0, 126, xSize, 96)
}
override fun drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int){
fontRenderer.drawString(titleContainer, 8, 6, COLOR_TEXT)
fontRenderer.drawString(titleInventory, 8, ySize - 94, COLOR_TEXT)
}
}
@@ -0,0 +1,43 @@
package chylex.hee.client.gui.base
import chylex.hee.client.render.util.GL
import chylex.hee.client.util.MC
import chylex.hee.game.container.base.ContainerBaseCustomInventory
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.color.IntColor.Companion.RGB
import net.minecraft.client.gui.inventory.GuiContainer
import net.minecraft.client.resources.I18n
import net.minecraft.inventory.IInventory
import net.minecraft.util.ResourceLocation
@Sided(Side.CLIENT)
abstract class GuiBaseCustomInventory<T : IInventory>(container: ContainerBaseCustomInventory<T>) : GuiContainer(container){
private companion object{
private val COLOR_TEXT = RGB(64u).i
}
protected abstract val texBackground: ResourceLocation
protected abstract val titleContainer: String
private val titleInventory = MC.player?.inventory?.displayName?.unformattedText ?: "" // 'mc' not initialized yet
override fun drawScreen(mouseX: Int, mouseY: Int, partialTicks: Float){
drawDefaultBackground()
super.drawScreen(mouseX, mouseY, partialTicks)
renderHoveredToolTip(mouseX, mouseY)
}
override fun drawGuiContainerBackgroundLayer(partialTicks: Float, mouseX: Int, mouseY: Int){
val x = (width - xSize) / 2
val y = (height - ySize) / 2
GL.color(1F, 1F, 1F, 1F)
mc.textureManager.bindTexture(texBackground)
drawTexturedModalRect(x, y, 0, 0, xSize, ySize)
}
override fun drawGuiContainerForegroundLayer(mouseX: Int, mouseY: Int){
fontRenderer.drawString(I18n.format(titleContainer), 8, 6, COLOR_TEXT)
fontRenderer.drawString(titleInventory, 8, ySize - 94, COLOR_TEXT)
}
}
@@ -0,0 +1,44 @@
package chylex.hee.client.model
import chylex.hee.client.util.MC
import chylex.hee.system.migration.Hand.MAIN_HAND
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.Vec3
import chylex.hee.system.util.lookPosVec
import chylex.hee.system.util.subtractY
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.util.EnumHand
import net.minecraft.util.EnumHandSide.RIGHT
import net.minecraft.util.math.MathHelper
import net.minecraft.util.math.Vec3d
import kotlin.math.abs
import kotlin.math.pow
object ModelHelper{
@Sided(Side.CLIENT)
fun getHandPosition(player: EntityPlayer, hand: EnumHand): Vec3d{
val yawOffsetMp = (if (player.primaryHand == RIGHT) 1 else -1) * (if (hand == MAIN_HAND) 1 else -1)
if (player === MC.player && MC.settings.thirdPersonView == 0){
val pitch = MathHelper.wrapDegrees(player.rotationPitch)
val yaw = MathHelper.wrapDegrees(player.rotationYaw)
val fov = MC.settings.fovSetting
return player
.lookPosVec
.subtractY(0.1 + (pitch.coerceIn(-90F, 45F) * 0.0034))
.add(Vec3.fromYaw(yaw + (yawOffsetMp * fov * 0.6F)).scale(0.25))
.add(Vec3.fromYaw(yaw + 165F - (fov - 90F) / 2F).scale(abs(pitch.coerceIn(0F, 90F) / 90.0).pow(1.5) * (0.3 - abs(fov - 90.0) / 600F)))
// TODO kinda weird and inaccurate, maybe use the camera transformations somehow?
}
else{
val handOffset = if (player.isSneaking) 1.15 else 0.75
return player
.lookPosVec
.subtractY(handOffset)
.add(Vec3.fromYaw(player.renderYawOffset + yawOffsetMp * 39F).scale(0.52))
}
}
}
@@ -0,0 +1,43 @@
package chylex.hee.client.model.block
import chylex.hee.client.render.util.beginBox
import chylex.hee.client.render.util.render
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.model.ModelBase
import net.minecraft.client.model.ModelRenderer
import kotlin.math.PI
import kotlin.math.abs
import kotlin.math.sin
@Sided(Side.CLIENT)
object ModelBlockIgneousPlate : ModelBase(){
const val ANIMATION_PERIOD = PI
private val outerBox: ModelRenderer
private val innerBox: ModelRenderer
init{
textureWidth = 32
textureHeight = 16
outerBox = ModelRenderer(this).apply {
beginBox.offset(12F, 4F, 0F).size( 2, 8, 2).tex(0, 6).add()
beginBox.offset( 2F, 4F, 0F).size( 2, 8, 2).tex(8, 6).add()
beginBox.offset( 2F, 2F, 0F).size(12, 2, 2).tex(0, 0).add()
beginBox.offset( 2F, 12F, 0F).size(12, 2, 2).tex(0, 4).add()
}
innerBox = ModelRenderer(this).apply {
beginBox.offset(4F, 4F, 0.5F).size(8, 8, 1).tex(14, 7).add()
}
}
fun renderOuterBox(){
outerBox.render()
}
fun renderInnerBox(animation: Double){
innerBox.offsetZ = -abs(sin(-animation)).toFloat() * 0.0925F
innerBox.render()
}
}
@@ -0,0 +1,69 @@
package chylex.hee.client.model.entity
import chylex.hee.client.render.util.beginBox
import chylex.hee.game.entity.living.EntityBossEnderEye
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.toRadians
import net.minecraft.client.model.ModelBase
import net.minecraft.client.model.ModelRenderer
import net.minecraft.entity.Entity
import net.minecraft.entity.EntityLivingBase
@Sided(Side.CLIENT)
object ModelEntityBossEnderEye : ModelBase(){
const val SCALE = 16F / 18F
private val head: ModelRenderer
private val eyes: Array<ModelRenderer>
private val arms: ModelRenderer
init{
textureWidth = 128
textureHeight = 64
head = ModelRenderer(this).apply {
setRotationPoint(0F, 15F, 0F)
beginBox.offset(-9F, -9F, -9F).size(18, 18, 18).tex(0, 0).add()
}
eyes = Array(8){
ModelRenderer(this).apply {
setRotationPoint(0F, 15F, 0F)
beginBox.offset(-8F, -8F, -9F).size(16, 16, 1).tex(-1 + (16 * it), 47).add()
cubeList[0].let { it.quadList = arrayOf(it.quadList[4]) } // front face only
}
}
arms = ModelRenderer(this).apply {
setRotationPoint(0F, 15.5F, -0.5F)
beginBox.offset(-12F, -1.5F, -1.5F).size(3, 27, 3).tex(73, 0).add()
beginBox.offset( 9F, -1.5F, -1.5F).size(3, 27, 3).tex(73, 0).mirror().add()
}
}
override fun setLivingAnimations(entity: EntityLivingBase, limbSwing: Float, limbSwingAmount: Float, partialTicks: Float){
super.setLivingAnimations(entity, limbSwing, limbSwingAmount, partialTicks)
arms.rotateAngleX = (entity as? EntityBossEnderEye)?.clientArmAngle?.get(partialTicks)?.toRadians() ?: 0F
}
override fun setRotationAngles(limbSwing: Float, limbSwingAmount: Float, ageInTicks: Float, netHeadYaw: Float, headPitch: Float, scale: Float, entity: Entity){
super.setRotationAngles(limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale, entity)
head.rotateAngleX = headPitch.toRadians()
}
override fun render(entity: Entity, limbSwing: Float, limbSwingAmount: Float, ageInTicks: Float, netHeadYaw: Float, headPitch: Float, scale: Float){
super.render(entity, limbSwing, limbSwingAmount, ageInTicks, netHeadYaw, headPitch, scale)
val boss = entity as? EntityBossEnderEye
val eyeState = when{
boss == null -> 1
boss.isSleeping -> 0
else -> boss.demonLevel + 1
}
head.render(scale)
eyes[eyeState].also { it.rotateAngleX = head.rotateAngleX }.render(scale)
arms.render(scale)
}
}
@@ -0,0 +1,25 @@
package chylex.hee.client.model.entity
import chylex.hee.client.render.util.beginBox
import chylex.hee.client.render.util.render
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.model.ModelBase
import net.minecraft.client.model.ModelRenderer
@Sided(Side.CLIENT)
object ModelEntityTokenHolder : ModelBase(){
private val box: ModelRenderer
init{
textureWidth = 64
textureHeight = 32
box = ModelRenderer(this).apply {
beginBox.offset(-8F, -8F, -8F).size(16, 16, 16).add()
}
}
fun render(){
box.render()
}
}
@@ -0,0 +1,51 @@
package chylex.hee.client.model.item
import chylex.hee.client.util.MC
import chylex.hee.init.ModItems
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.migration.forge.SubscribeEvent
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.renderer.block.model.IBakedModel
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.FIRST_PERSON_LEFT_HAND
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.FIRST_PERSON_RIGHT_HAND
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.THIRD_PERSON_LEFT_HAND
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.THIRD_PERSON_RIGHT_HAND
import net.minecraft.client.renderer.block.model.ModelBakery
import net.minecraft.client.renderer.block.model.ModelResourceLocation
import net.minecraftforge.client.event.ModelBakeEvent
import net.minecraftforge.client.model.BakedModelWrapper
import net.minecraftforge.common.MinecraftForge
import org.apache.commons.lang3.tuple.Pair
import javax.vecmath.Matrix4f
@Sided(Side.CLIENT)
class ModelItemAmuletOfRecovery private constructor(sourceModel: IBakedModel) : BakedModelWrapper<IBakedModel>(sourceModel){
companion object{
private val RESOURCE_NORMAL = ModelResourceLocation(Resource.Custom("amulet_of_recovery"), "inventory")
private val RESOURCE_HELD = ModelResourceLocation(Resource.Custom("amulet_of_recovery_held"), "held")
fun register(){
ModelBakery.registerItemVariants(ModItems.AMULET_OF_RECOVERY, RESOURCE_NORMAL, RESOURCE_HELD)
MinecraftForge.EVENT_BUS.register(this)
}
@SubscribeEvent
fun onModelBake(e: ModelBakeEvent){
with(e.modelRegistry){
putObject(RESOURCE_NORMAL, ModelItemAmuletOfRecovery(getObject(RESOURCE_NORMAL)!!))
}
}
}
override fun handlePerspective(transformType: TransformType): Pair<out IBakedModel, Matrix4f> = when(transformType){
FIRST_PERSON_LEFT_HAND,
FIRST_PERSON_RIGHT_HAND,
THIRD_PERSON_LEFT_HAND,
THIRD_PERSON_RIGHT_HAND ->
MC.itemRenderer.itemModelMesher.modelManager.getModel(RESOURCE_HELD).handlePerspective(transformType)
else ->
super.handlePerspective(transformType)
}
}
@@ -0,0 +1,160 @@
package chylex.hee.client.render
import chylex.hee.HEE
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.DF_ZERO
import chylex.hee.client.render.util.GL.FOG_EXP
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.util.MC
import chylex.hee.game.block.BlockAbstractPortal
import chylex.hee.game.block.entity.TileEntityEnergyCluster
import chylex.hee.game.block.info.Materials
import chylex.hee.game.mechanics.energy.IEnergyQuantity
import chylex.hee.game.mechanics.energy.IEnergyQuantity.Companion.MAX_POSSIBLE_VALUE
import chylex.hee.game.mechanics.energy.IEnergyQuantity.Companion.displayString
import chylex.hee.init.ModBlocks
import chylex.hee.init.ModItems
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.SubscribeAllEvents
import chylex.hee.system.migration.forge.SubscribeEvent
import chylex.hee.system.util.color.IntColor
import chylex.hee.system.util.color.IntColor.Companion.RGB
import chylex.hee.system.util.color.IntColor.Companion.RGBA
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.getBlock
import chylex.hee.system.util.getTile
import net.minecraft.client.gui.Gui
import net.minecraft.client.renderer.ActiveRenderInfo
import net.minecraft.client.resources.I18n
import net.minecraft.util.math.RayTraceResult.Type.BLOCK
import net.minecraft.util.text.TextFormatting
import net.minecraftforge.client.event.DrawBlockHighlightEvent
import net.minecraftforge.client.event.EntityViewRenderEvent.FogDensity
import net.minecraftforge.client.event.RenderGameOverlayEvent
import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType.HELMET
@SubscribeAllEvents(Side.CLIENT, modid = HEE.ID)
object OverlayRenderer{
private const val BORDER_SIZE = 4
private const val LINE_SPACING = 7
private val TEX_ENDER_GOO_OVERLAY = Resource.Custom("textures/overlay/ender_goo.png")
private val TEX_PURIFIED_ENDER_GOO_OVERLAY = Resource.Custom("textures/overlay/purified_ender_goo.png")
private var clusterLookedAt: TileEntityEnergyCluster? = null
// Ender Goo
@JvmStatic
@SubscribeEvent
fun onFogDensity(e: FogDensity){
val entity = e.entity
val inside = ActiveRenderInfo.getBlockStateAtEntityViewpoint(entity.world, entity, e.renderPartialTicks.toFloat()).material
if (inside === Materials.ENDER_GOO || inside === Materials.PURIFIED_ENDER_GOO){
GL.setFogMode(FOG_EXP)
e.density = if (inside === Materials.ENDER_GOO) 0.66F else 0.06F
e.isCanceled = true // otherwise the event is ignored
}
}
@JvmStatic
@SubscribeEvent
fun onRenderHelmetOverlayPre(e: RenderGameOverlayEvent.Pre){
if (e.type != HELMET){
return
}
val player = MC.player ?: return
val inside = ActiveRenderInfo.getBlockStateAtEntityViewpoint(player.world, player, e.partialTicks).material
if ((inside === Materials.ENDER_GOO || inside === Materials.PURIFIED_ENDER_GOO) && MC.settings.thirdPersonView == 0 && !player.isSpectator){
val scaledResolution = MC.resolution
val brightness = player.brightness
GL.color(brightness, brightness, brightness, 1F)
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA, SF_ONE, DF_ZERO)
if (inside === Materials.ENDER_GOO){
MC.textureManager.bindTexture(TEX_ENDER_GOO_OVERLAY)
}
else{
MC.textureManager.bindTexture(TEX_PURIFIED_ENDER_GOO_OVERLAY)
}
MC.instance.ingameGUI.drawTexturedModalRect(0, 0, 0, 0, scaledResolution.scaledWidth, scaledResolution.scaledHeight)
GL.color(1F, 1F, 1F, 1F)
}
}
// Energy Cluster
@JvmStatic
@SubscribeEvent
fun onRenderText(@Suppress("UNUSED_PARAMETER") e: RenderGameOverlayEvent.Text){
fun drawTextOffScreenCenter(x: Int, y: Int, line: Int, text: String, color: IntColor){
val scaledResolution = MC.resolution
with(MC.fontRenderer){
val centerX = x + (scaledResolution.scaledWidth / 2)
val centerY = y + (scaledResolution.scaledHeight / 2) + (line * (LINE_SPACING + FONT_HEIGHT))
val textWidth = getStringWidth(text)
val textHeight = FONT_HEIGHT
val offsetX = -(textWidth / 2)
val offsetY = -(textHeight / 2)
Gui.drawRect(centerX + offsetX - BORDER_SIZE, centerY + offsetY - BORDER_SIZE, centerX - offsetX + BORDER_SIZE - 1, centerY - offsetY + BORDER_SIZE - 1, RGBA(0u, 0.6F).i)
drawStringWithShadow(text, (centerX + offsetX).toFloat(), (centerY + offsetY).toFloat(), color.i)
}
}
clusterLookedAt?.let {
clusterLookedAt = null
fun getQuantityString(quantity: IEnergyQuantity): String{
return if (it.energyLevel == MAX_POSSIBLE_VALUE)
"${TextFormatting.OBFUSCATED}##${TextFormatting.RESET}"
else
quantity.displayString
}
val isIgnored = MC.player?.let { player -> ModItems.ENERGY_ORACLE.isClusterIgnored(player, it.pos) } == true
val firstLine = if (isIgnored) -1 else 0
val health = it.currentHealth
drawTextOffScreenCenter(0, -40, firstLine, I18n.format("hee.energy.overlay.health", health), health.textColor)
val level = getQuantityString(it.energyLevel)
val capacity = getQuantityString(it.energyRegenCapacity)
drawTextOffScreenCenter(0, -40, firstLine + 1, I18n.format("hee.energy.overlay.level", level, capacity), RGB(220u))
if (isIgnored){
drawTextOffScreenCenter(0, -40, firstLine + 2, I18n.format("hee.energy.overlay.ignored"), RGB(160u))
}
}
}
// Block outlines
@JvmStatic
@SubscribeEvent
fun onRenderBlockOutline(e: DrawBlockHighlightEvent){
if (e.target.typeOfHit == BLOCK){ // why the fuck is this still called for air and entities
val world = e.player.world
val pos = e.target.blockPos
val block = pos.getBlock(world)
if (block === ModBlocks.ENERGY_CLUSTER){
clusterLookedAt = pos.getTile(world)
e.isCanceled = true
}
else if (block is BlockAbstractPortal){
e.isCanceled = true
}
}
}
}
@@ -0,0 +1,237 @@
package chylex.hee.client.render
import chylex.hee.HEE
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.DF_ZERO
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.util.MC
import chylex.hee.game.particle.ParticleVoid
import chylex.hee.game.particle.spawner.ParticleSpawnerCustom
import chylex.hee.game.particle.util.IOffset.InBox
import chylex.hee.game.particle.util.IShape.Point
import chylex.hee.game.world.WorldProviderEndCustom
import chylex.hee.game.world.territory.TerritoryType
import chylex.hee.game.world.territory.TerritoryVoid
import chylex.hee.system.Debug
import chylex.hee.system.migration.forge.EventPriority
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.SubscribeAllEvents
import chylex.hee.system.migration.forge.SubscribeEvent
import chylex.hee.system.util.color.IntColor
import chylex.hee.system.util.color.IntColor.Companion.RGB
import chylex.hee.system.util.floorToInt
import chylex.hee.system.util.lookDirVec
import chylex.hee.system.util.math.LerpedFloat
import chylex.hee.system.util.posVec
import chylex.hee.system.util.scale
import net.minecraft.client.resources.I18n
import net.minecraft.entity.player.EntityPlayer
import net.minecraftforge.client.event.RenderGameOverlayEvent
import net.minecraftforge.common.MinecraftForge
import net.minecraftforge.fml.common.gameevent.TickEvent.ClientTickEvent
import net.minecraftforge.fml.common.gameevent.TickEvent.Phase
import org.lwjgl.opengl.GL11.GL_GREATER
import kotlin.math.min
import kotlin.math.pow
@SubscribeAllEvents(Side.CLIENT, modid = HEE.ID)
object TerritoryRenderer{
private var prevChunkX = Int.MAX_VALUE
private var prevTerritory: TerritoryType? = null
@JvmStatic
@SubscribeEvent
fun onClientTick(e: ClientTickEvent){
if (e.phase == Phase.START){
val player = MC.player
if (player != null && player.world.provider is WorldProviderEndCustom && player.ticksExisted > 0){
Void.tick(player)
Title.tick()
val newChunkX = player.chunkCoordX
if (prevChunkX != newChunkX){
prevChunkX = newChunkX
val newTerritory = TerritoryType.fromX(player.posX.floorToInt())
if (prevTerritory != newTerritory){
prevTerritory = newTerritory
if (newTerritory != null){
Void.reset()
Title.display(newTerritory)
newTerritory.desc.environment.setupClient()
}
}
}
prevTerritory?.desc?.environment?.tickClient()
}
else if (prevTerritory != null){
prevTerritory = null
prevChunkX = Int.MAX_VALUE
Void.reset()
Title.reset()
}
}
}
// Void handling
val VOID_FACTOR_VALUE
get() = Void.voidFactor.get(MC.partialTicks)
private object Void{
private val VOID_PARTICLE = ParticleSpawnerCustom(
type = ParticleVoid,
pos = InBox(8F)
)
val voidFactor = LerpedFloat(TerritoryVoid.OUTSIDE_VOID_FACTOR)
init{
if (Debug.enabled){
MinecraftForge.EVENT_BUS.register(this)
}
}
fun tick(player: EntityPlayer){
val factor = TerritoryVoid.getVoidFactor(player).also(voidFactor::update)
if (factor == TerritoryVoid.OUTSIDE_VOID_FACTOR || MC.instance.isGamePaused){
return
}
if (factor > -1F){
val rand = player.rng
val mp = min(1F, (factor * 0.275F) + 0.275F)
val extra = (mp.pow(1.5F) * 12F).floorToInt()
VOID_PARTICLE.spawn(Point(player, heightMp = 0.5F, amount = 2 + extra), rand)
VOID_PARTICLE.spawn(Point(player.posVec.add(player.lookDirVec.scale(5)), amount = extra / 2), rand)
}
}
fun reset(){
voidFactor.updateImmediately(TerritoryVoid.OUTSIDE_VOID_FACTOR)
}
@SubscribeEvent
fun onRenderGameOverlayText(e: RenderGameOverlayEvent.Text){
if (MC.settings.showDebugInfo && MC.player?.dimension == HEE.DIM){
with(e.left){
add("")
add("End Void Factor: ${"%.3f".format(voidFactor.currentValue)}")
}
}
}
}
// Text rendering
@SubscribeAllEvents(Side.CLIENT, modid = HEE.ID)
private object Title{
private const val FADE_TICKS = 22
private var textTime = 0
private var textFade = 0
private var textTitle = ""
private var textMainColor = RGB(0u)
private var textShadowColor = RGB(0u)
fun display(newTerritory: TerritoryType){
val title = I18n.format(newTerritory.translationKey)
textTime = 60 + (2 * title.length)
textFade = FADE_TICKS
textTitle = title
with(newTerritory.desc.colors){
if (tokenTop.asVec.lengthSquared() > tokenBottom.asVec.lengthSquared()){
textMainColor = tokenTop
textShadowColor = tokenBottom
}
else{
textMainColor = tokenBottom
textShadowColor = tokenTop
}
textShadowColor = textShadowColor.let { RGB(it.red / 2, it.green / 2, it.blue / 2) }
}
}
fun tick(){
if (textTime > 0){
--textTime
--textFade
}
}
fun reset(){
textTime = 0
}
@JvmStatic
@SubscribeEvent(EventPriority.HIGHEST)
fun onRenderGameOverlayText(e: RenderGameOverlayEvent.Text){
if (textTime == 0){
return
}
val fontRenderer = MC.fontRenderer
val resolution = e.resolution
val width = resolution.scaledWidth
val height = resolution.scaledHeight
val opacity = when{
textFade > 0 -> ((FADE_TICKS - (textFade - e.partialTicks)) / FADE_TICKS.toFloat()).coerceIn(0F, 1F)
textTime < FADE_TICKS -> ((textTime - e.partialTicks) / FADE_TICKS.toFloat()).coerceIn(0F, 1F)
else -> 1F
}
GL.pushMatrix()
GL.translate(width * 0.5F, height * 0.5F, 0F)
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA, SF_ONE, DF_ZERO)
GL.alphaFunc(GL_GREATER, 0F)
GL.pushMatrix()
GL.scale(3F, 3F, 3F)
val x = -fontRenderer.getStringWidth(textTitle) * 0.5F
val y = -fontRenderer.FONT_HEIGHT - 2F
drawTitle(x + 0.5F, y + 0.5F, textShadowColor.withAlpha(opacity.pow(1.25F)))
drawTitle(x, y, textMainColor.withAlpha(opacity))
GL.popMatrix()
GL.alphaFunc(GL_GREATER, 0.1F)
GL.disableBlend()
GL.popMatrix()
}
private fun drawTitle(x: Float, y: Float, color: IntColor) = with(MC.fontRenderer){
resetStyles()
red = color.red / 255F
green = color.green / 255F
blue = color.blue / 255F
alpha = color.alpha / 255F
posX = x
posY = y
val text = if (bidiFlag)
bidiReorder(textTitle)
else
textTitle
GL.color(red, green, blue, alpha)
renderStringAtPos(text, false)
}
}
}
@@ -0,0 +1,66 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.game.block.entity.base.TileEntityBaseChest
import chylex.hee.system.migration.Facing.EAST
import chylex.hee.system.migration.Facing.NORTH
import chylex.hee.system.migration.Facing.WEST
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.model.ModelChest
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.util.ResourceLocation
import org.lwjgl.opengl.GL11.GL_MODELVIEW
import org.lwjgl.opengl.GL11.GL_TEXTURE
import kotlin.math.PI
import kotlin.math.pow
@Sided(Side.CLIENT)
abstract class RenderTileAbstractChest<T : TileEntityBaseChest> : TileEntitySpecialRenderer<T>(){
protected abstract val texture: ResourceLocation
private val modelChest = ModelChest()
override fun render(tile: T, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
if (destroyStage >= 0){
bindTexture(DESTROY_STAGES[destroyStage])
GL.matrixMode(GL_TEXTURE)
GL.pushMatrix()
GL.scale(4F, 4F, 1F)
GL.translate(0.0625F, 0.0625F, 0.0625F)
GL.matrixMode(GL_MODELVIEW)
}
else{
bindTexture(texture)
}
GL.pushMatrix()
GL.enableRescaleNormal()
GL.color(1F, 1F, 1F, alpha)
GL.translate(x, y + 1F, z + 1F)
GL.scale(1F, -1F, -1F)
GL.translate(0.5F, 0.5F, 0.5F)
val rotation = when(tile.facing){
EAST -> 270F
NORTH -> 180F
WEST -> 90F
else -> 0F
}
GL.rotate(rotation, 0F, 1F, 0F)
GL.translate(-0.5F, -0.5F, -0.5F)
modelChest.chestLid.rotateAngleX = -(1F - (1F - tile.lidAngle.get(partialTicks)).pow(3)) * PI.toFloat() * 0.5F
modelChest.renderAll()
GL.disableRescaleNormal()
GL.popMatrix()
GL.color(1F, 1F, 1F, 1F)
if (destroyStage >= 0){
GL.matrixMode(GL_TEXTURE)
GL.popMatrix()
GL.matrixMode(GL_MODELVIEW)
}
}
}
@@ -0,0 +1,232 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.render.util.GL.TEX_Q
import chylex.hee.client.render.util.GL.TEX_R
import chylex.hee.client.render.util.GL.TEX_S
import chylex.hee.client.render.util.GL.TEX_T
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.game.block.BlockAbstractPortal
import chylex.hee.game.block.BlockAbstractPortal.IPortalController
import chylex.hee.game.block.entity.TileEntityPortalInner
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.square
import net.minecraft.client.renderer.ActiveRenderInfo
import net.minecraft.client.renderer.GLAllocation
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.Vec3d
import net.minecraft.world.World
import org.lwjgl.opengl.GL11.GL_EYE_LINEAR
import org.lwjgl.opengl.GL11.GL_EYE_PLANE
import org.lwjgl.opengl.GL11.GL_MODELVIEW
import org.lwjgl.opengl.GL11.GL_OBJECT_LINEAR
import org.lwjgl.opengl.GL11.GL_OBJECT_PLANE
import org.lwjgl.opengl.GL11.GL_QUADS
import org.lwjgl.opengl.GL11.GL_TEXTURE
import java.util.Random
import kotlin.math.pow
@Sided(Side.CLIENT)
abstract class RenderTileAbstractPortal<T : TileEntityPortalInner, C : IPortalController> : TileEntitySpecialRenderer<T>(){
private companion object{
private val TEX_BACKGROUND = Resource.Vanilla("textures/environment/end_sky.png")
private val TEX_PARTICLE_LAYER = Resource.Vanilla("textures/entity/end_portal.png")
private val BUFFER = GLAllocation.createDirectFloatBuffer(16)
private fun updateBuffer(value1: Float, value2: Float, value3: Float, value4: Float) = BUFFER.apply {
clear()
put(value1)
put(value2)
put(value3)
put(value4)
flip()
}
private fun getLayerCount(distSq: Double) = when{
distSq > square(60) -> 5
distSq > square(48) -> 7
distSq > square(38) -> 9
distSq > square(30) -> 11
distSq > square(24) -> 13
distSq > square(20) -> 14
else -> 15
}
}
private var cameraTarget = Vec3d.ZERO
private var globalTranslation = 0F
private var isAnimating = false
private var animationProgress = 0F
private fun calculateEasing(layer: Int): Float{
return if (isAnimating)
(1.1F - square(animationProgress * 4.5F - 4.816F) + 22.1F * (1F - ((layer - 1F) / 14F).pow(1.2F))).coerceIn(0F, 1F).pow(1.5F)
else
animationProgress
}
// Properties
protected val rand = Random()
protected val color = FloatArray(3)
protected abstract fun findController(world: World, pos: BlockPos): C?
protected abstract fun generateSeed(controller: C): Long
protected abstract fun generateNextColor(controller: C, layer: Int)
// Rendering
override fun render(tile: T, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
val controller = findController(tile.world, tile.pos)
rand.setSeed(controller?.let { generateSeed(it) } ?: 0L)
animationProgress = controller?.clientAnimationProgress?.get(partialTicks) ?: 0F
isAnimating = animationProgress > 0F && animationProgress < 1F
cameraTarget = ActiveRenderInfo.getCameraPosition()
globalTranslation = ((MC.systemTime % BlockAbstractPortal.TRANSLATION_SPEED_LONG) / BlockAbstractPortal.TRANSLATION_SPEED) - (controller?.clientPortalOffset?.get(partialTicks) ?: 0F)
val offsetY = -y - 0.75
val topY = offsetY + cameraTarget.y
// setup
GL.disableLighting()
GL.enableBlend()
GL.enableTexGenCoord(TEX_S)
GL.enableTexGenCoord(TEX_T)
GL.enableTexGenCoord(TEX_R)
GL.enableTexGenCoord(TEX_Q)
MC.entityRenderer.setupFogColor(true)
// background
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA)
controller?.let { generateNextColor(it, 0) }
transformColor { 0.1F } // discards provided value
renderLayer(
x, y, z,
texture = TEX_BACKGROUND,
layerPosition = (topY / (topY + 65.0)) - offsetY,
layerRotation = 0F,
layerScale = 0.125F,
cameraOffsetMp = 65.0 / topY
)
// inner layers
GL.blendFunc(SF_ONE, DF_ONE)
val layerCount = getLayerCount((x * x) + (y * y) + (z * z))
for(layer in 1..15){
val layerIndexRev = 16 - layer
val colorMultiplier = 1F / (layerIndexRev + 1F)
controller?.let { generateNextColor(it, layer) }
transformColor { it * colorMultiplier * calculateEasing(layer) }
if (layerIndexRev <= layerCount){
renderLayer(
x, y, z,
texture = TEX_PARTICLE_LAYER,
layerPosition = (topY / (topY + layerIndexRev)) - offsetY,
layerRotation = 2F * ((square(layer) * 4321) + (layer * 9)),
layerScale = 0.0625F,
cameraOffsetMp = layerIndexRev / topY
)
}
}
// cleanup
MC.entityRenderer.setupFogColor(false)
GL.disableTexGenCoord(TEX_S)
GL.disableTexGenCoord(TEX_T)
GL.disableTexGenCoord(TEX_R)
GL.disableTexGenCoord(TEX_Q)
GL.disableBlend()
GL.enableLighting()
}
// Utilities
private inline fun transformColor(func: (Float) -> Float){
color[0] = func(color[0])
color[1] = func(color[1])
color[2] = func(color[2])
}
private fun renderLayer(renderX: Double, renderY: Double, renderZ: Double, texture: ResourceLocation, layerPosition: Double, layerRotation: Float, layerScale: Float, cameraOffsetMp: Double){
val globalX = rendererDispatcher.entityX
val globalY = rendererDispatcher.entityY
val globalZ = rendererDispatcher.entityZ
// texture
if (texture != TEX_BACKGROUND){
bindTexture(TEX_BACKGROUND) // force re-bind to fix a bug in older AMD drivers
}
bindTexture(texture)
GL.pushMatrix()
GL.translate(globalX, layerPosition, globalZ)
GL.texGenMode(TEX_S, GL_OBJECT_LINEAR)
GL.texGenMode(TEX_T, GL_OBJECT_LINEAR)
GL.texGenMode(TEX_R, GL_OBJECT_LINEAR)
GL.texGenMode(TEX_Q, GL_EYE_LINEAR)
GL.texGenParam(TEX_S, GL_OBJECT_PLANE, updateBuffer(1F, 0F, 0F, 0F))
GL.texGenParam(TEX_T, GL_OBJECT_PLANE, updateBuffer(0F, 0F, 1F, 0F))
GL.texGenParam(TEX_R, GL_OBJECT_PLANE, updateBuffer(1F, 0F, 0F, 1F))
GL.texGenParam(TEX_Q, GL_EYE_PLANE, updateBuffer(0F, 1F, 0F, 0F))
GL.popMatrix()
// position
GL.matrixMode(GL_TEXTURE)
GL.pushMatrix()
GL.loadIdentity()
GL.translate(0F, globalTranslation, 0F)
GL.scale(layerScale, layerScale, layerScale)
GL.translate(0.5F, 0.5F, 0.5F)
GL.rotate(layerRotation, 0F, 0F, 1F)
GL.translate((cameraTarget.x * cameraOffsetMp) - globalX - 0.5, (cameraTarget.z * cameraOffsetMp) - globalZ - 0.5, -globalY * 2)
// rendering
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_COLOR){
pos(renderX + 0.0, renderY + 0.75, renderZ + 0.0).color(color[0], color[1], color[2], 1F).endVertex()
pos(renderX + 0.0, renderY + 0.75, renderZ + 1.0).color(color[0], color[1], color[2], 1F).endVertex()
pos(renderX + 1.0, renderY + 0.75, renderZ + 1.0).color(color[0], color[1], color[2], 1F).endVertex()
pos(renderX + 1.0, renderY + 0.75, renderZ + 0.0).color(color[0], color[1], color[2], 1F).endVertex()
}
GL.popMatrix()
GL.matrixMode(GL_MODELVIEW)
}
}
@@ -0,0 +1,41 @@
package chylex.hee.client.render.block
import chylex.hee.game.block.entity.TileEntityDarkChest
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.renderer.tileentity.TileEntityChestRenderer
import net.minecraft.client.renderer.tileentity.TileEntityItemStackRenderer
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher
import net.minecraft.item.ItemStack
import net.minecraft.tileentity.TileEntityChest
@Sided(Side.CLIENT)
object RenderTileDarkChest : TileEntityChestRenderer(){
private val TEX_SINGLE = Resource.Custom("textures/entity/dark_chest_single.png")
private val TEX_DOUBLE = Resource.Custom("textures/entity/dark_chest_double.png")
init{
isChristmas = false
}
override fun render(tile: TileEntityChest, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
val prevTexSingle = TEXTURE_NORMAL
val prevTexDouble = TEXTURE_NORMAL_DOUBLE
TEXTURE_NORMAL = TEX_SINGLE
TEXTURE_NORMAL_DOUBLE = TEX_DOUBLE
super.render(tile, x, y, z, partialTicks, destroyStage, alpha)
TEXTURE_NORMAL = prevTexSingle
TEXTURE_NORMAL_DOUBLE = prevTexDouble
}
object AsItem : TileEntityItemStackRenderer(){
private val tile = TileEntityDarkChest()
override fun renderByItem(stack: ItemStack, partialTicks: Float){
TileEntityRendererDispatcher.instance.render(tile, 0.0, 0.0, 0.0, partialTicks)
}
}
}
@@ -0,0 +1,38 @@
package chylex.hee.client.render.block
import chylex.hee.HEE
import chylex.hee.game.block.BlockAbstractPortal
import chylex.hee.game.block.BlockAbstractPortal.IPortalController
import chylex.hee.game.block.entity.TileEntityEndPortalAcceptor
import chylex.hee.game.block.entity.TileEntityPortalInner
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.closestTickingTile
import chylex.hee.system.util.math.LerpedFloat
import net.minecraft.util.math.BlockPos
import net.minecraft.world.World
@Sided(Side.CLIENT)
object RenderTileEndPortal : RenderTileAbstractPortal<TileEntityPortalInner.End, IPortalController>(){
private object AlwaysOnController : IPortalController{
override val clientAnimationProgress = LerpedFloat(1F)
override val clientPortalOffset = LerpedFloat(0F)
}
override fun findController(world: World, pos: BlockPos): IPortalController?{
if (world.provider.dimension == HEE.DIM){
return AlwaysOnController
}
return pos.closestTickingTile<TileEntityEndPortalAcceptor>(world, BlockAbstractPortal.MAX_DISTANCE_FROM_FRAME)
}
override fun generateSeed(controller: IPortalController): Long{
return 31100L
}
override fun generateNextColor(controller: IPortalController, layer: Int){
color[0] = (rand.nextFloat() * 0.5F) + 0.1F
color[1] = (rand.nextFloat() * 0.5F) + 0.4F
color[2] = (rand.nextFloat() * 0.5F) + 0.5F
}
}
@@ -0,0 +1,60 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.model.ModelRenderer
import net.minecraft.client.model.ModelSkeletonHead
import net.minecraft.client.renderer.tileentity.TileEntityItemStackRenderer
import net.minecraft.entity.Entity
import net.minecraft.item.ItemStack
@Sided(Side.CLIENT)
object RenderTileEndermanHead{
private val TEX_ENDERMAN = Resource.Custom("textures/entity/enderman_head.png")
private val MODEL_HEAD = ModelSkeletonHead(0, 0, 64, 32)
@Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS")
private fun renderHead(){
MC.textureManager.bindTexture(TEX_ENDERMAN)
MODEL_HEAD.render(null, 0F, 0F, 0F, 180F, 0F, 0.0625F)
}
object AsItem : TileEntityItemStackRenderer(){
override fun renderByItem(stack: ItemStack, partialTicks: Float){
GL.pushMatrix()
GL.disableCull()
GL.translate(0.5F, 0F, 0.5F)
GL.enableRescaleNormal()
GL.scale(-1F, -1F, 1F)
GL.enableAlpha()
renderHead()
GL.enableCull()
GL.popMatrix()
}
}
object AsHeadLayer{
operator fun invoke(entity: Entity, headModel: ModelRenderer){
GL.pushMatrix()
GL.disableCull()
if (entity.isSneaking){
GL.translate(0F, 0.2F, 0F)
}
headModel.postRender(0.0625F)
GL.color(1F, 1F, 1F, 1F)
GL.scale(1.1875F, 1.1875F, -1.1875F)
renderHead()
GL.enableCull()
GL.popMatrix()
}
}
}
@@ -0,0 +1,109 @@
package chylex.hee.client.render.block
import chylex.hee.HEE
import chylex.hee.game.block.entity.TileEntityExperienceGate
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.migration.forge.SubscribeAllEvents
import chylex.hee.system.migration.forge.SubscribeEvent
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.floorToInt
import net.minecraft.client.renderer.BufferBuilder
import net.minecraft.client.renderer.texture.TextureAtlasSprite
import net.minecraft.util.math.BlockPos
import net.minecraft.world.World
import net.minecraftforge.client.event.TextureStitchEvent
import net.minecraftforge.client.model.animation.FastTESR
@Sided(Side.CLIENT)
@SubscribeAllEvents(Side.CLIENT, modid = HEE.ID)
object RenderTileExperienceGate : FastTESR<TileEntityExperienceGate>(){
private const val SPRITE_COUNT = 40
private val TEX = Array(SPRITE_COUNT){ Resource.Custom("block/experience_gate_top_bar_$it") }
private val SPRITES = mutableListOf<TextureAtlasSprite>()
private val FRAMES_CORNER = intArrayOf(9, 10, 11, 12, 13, 14, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39)
private val FRAMES_STRAIGHT = intArrayOf(9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24)
private val FRAMES = arrayOf(
intArrayOf(0, 1, 2),
FRAMES_STRAIGHT,
FRAMES_CORNER,
FRAMES_STRAIGHT,
intArrayOf(5, 6, 7, 8, 4),
FRAMES_STRAIGHT,
FRAMES_CORNER,
FRAMES_STRAIGHT,
intArrayOf(3, 4)
)
private val FRAME_COUNT = 1 + FRAMES.sumBy { it.size }
private val FRAME_OFFSETS = FRAMES.indices.map { index -> 1 + FRAMES.take(index).sumBy { it.size } }.toIntArray()
@JvmStatic
@SubscribeEvent
fun onTextureStitchPre(e: TextureStitchEvent.Pre){
with(e.map){
TEX.forEach { registerSprite(it) }
}
}
@JvmStatic
@SubscribeEvent
fun onTextureStitchPost(e: TextureStitchEvent.Post){
SPRITES.clear()
with(e.map){
TEX.forEach { SPRITES.add(getAtlasSprite(it.toString())) }
}
}
private fun getTexture(index: Int, frame: Int): TextureAtlasSprite?{
return FRAMES[index].getOrNull((frame - FRAME_OFFSETS[index]).coerceAtMost(FRAMES[index].lastIndex))?.let(SPRITES::getOrNull)
}
override fun renderTileEntityFast(tile: TileEntityExperienceGate, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, partial: Float, buffer: BufferBuilder){
val world = tile.world
val pos = tile.pos
val progress = tile.chargeProgress
val frame = if (progress == 0F) 0 else 1 + (progress * (FRAME_COUNT - 2)).floorToInt()
val topLeftBlock = getTexture(8, frame) ?: getTexture(0, frame)
topLeftBlock?.let { buffer.renderTextureAt(x - 1.0, y, z - 1.0, world, pos.add(-1, 1, -1), it, 0b000) }
getTexture(1, frame)?.let { buffer.renderTextureAt(x + 0.0, y, z - 1.0, world, pos.add( 0, 1, -1), it, 0b111) }
getTexture(2, frame)?.let { buffer.renderTextureAt(x + 1.0, y, z - 1.0, world, pos.add( 1, 1, -1), it, 0b011) }
getTexture(3, frame)?.let { buffer.renderTextureAt(x + 1.0, y, z + 0.0, world, pos.add( 1, 1, 0), it, 0b110) }
getTexture(4, frame)?.let { buffer.renderTextureAt(x + 1.0, y, z + 1.0, world, pos.add( 1, 1, 1), it, 0b110) }
getTexture(5, frame)?.let { buffer.renderTextureAt(x + 0.0, y, z + 1.0, world, pos.add( 0, 1, 1), it, 0b001) }
getTexture(6, frame)?.let { buffer.renderTextureAt(x - 1.0, y, z + 1.0, world, pos.add(-1, 1, 1), it, 0b101) }
getTexture(7, frame)?.let { buffer.renderTextureAt(x - 1.0, y, z + 0.0, world, pos.add(-1, 1, 0), it, 0b000) }
}
private fun BufferBuilder.renderTextureAt(x: Double, y: Double, z: Double, world: World, pos: BlockPos, tex: TextureAtlasSprite, rot: Int){
val rotX = (((rot shr 1) and 1) - 0.5) * 1.002
val rotZ = (((rot shr 2) and 1) - 0.5) * 1.002
val u1 = tex.minU.toDouble()
val u2 = tex.maxU.toDouble()
val v1 = tex.minV.toDouble()
val v2 = tex.maxV.toDouble()
val c = if (rot and 1 == 0){
doubleArrayOf(u1, u2, u2, u1, v1, v1, v2, v2)
}
else{
doubleArrayOf(u1, u1, u2, u2, v1, v2, v2, v1)
}
val light = world.getCombinedLight(pos, 0)
val sky = (light shr 16) and 65535
val block = light and 65535
this.pos(x + 0.5 + rotX, y + 1.001, z + 0.5 + rotZ).color(255, 255, 255, 255).tex(c[0], c[4]).lightmap(sky, block).endVertex()
this.pos(x + 0.5 - rotX, y + 1.001, z + 0.5 + rotZ).color(255, 255, 255, 255).tex(c[1], c[5]).lightmap(sky, block).endVertex()
this.pos(x + 0.5 - rotX, y + 1.001, z + 0.5 - rotZ).color(255, 255, 255, 255).tex(c[2], c[6]).lightmap(sky, block).endVertex()
this.pos(x + 0.5 + rotX, y + 1.001, z + 0.5 - rotZ).color(255, 255, 255, 255).tex(c[3], c[7]).lightmap(sky, block).endVertex()
}
}
@@ -0,0 +1,112 @@
package chylex.hee.client.render.block
import chylex.hee.client.model.block.ModelBlockIgneousPlate
import chylex.hee.client.render.util.GL
import chylex.hee.game.block.BlockIgneousPlate
import chylex.hee.game.block.entity.TileEntityIgneousPlate
import chylex.hee.init.ModBlocks
import chylex.hee.system.migration.Facing.EAST
import chylex.hee.system.migration.Facing.NORTH
import chylex.hee.system.migration.Facing.UP
import chylex.hee.system.migration.Facing.WEST
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.color.IntColor.Companion.RGB
import chylex.hee.system.util.component1
import chylex.hee.system.util.component2
import chylex.hee.system.util.component3
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.floorToInt
import chylex.hee.system.util.get
import chylex.hee.system.util.getState
import chylex.hee.system.util.offsetTowards
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.util.math.Vec3d
import org.lwjgl.opengl.GL11.GL_MODELVIEW
import org.lwjgl.opengl.GL11.GL_TEXTURE
@Sided(Side.CLIENT)
object RenderTileIgneousPlate : TileEntitySpecialRenderer<TileEntityIgneousPlate>(){
private val TEX_PLATE = Resource.Custom("textures/entity/igneous_plate.png")
private val COLOR_TRANSITIONS = arrayOf(
RGB(207, 187, 161).asVec,
RGB(247, 205, 82).asVec,
RGB(235, 23, 23).asVec
)
private fun getInnerBoxColor(combinedHeat: Float): Vec3d{
val index = combinedHeat.floorToInt().coerceIn(0, COLOR_TRANSITIONS.lastIndex - 1)
val progress = combinedHeat.toDouble() - index
return COLOR_TRANSITIONS[index].offsetTowards(COLOR_TRANSITIONS[index + 1], progress)
}
override fun render(tile: TileEntityIgneousPlate, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
if (destroyStage >= 0){
bindTexture(DESTROY_STAGES[destroyStage])
GL.matrixMode(GL_TEXTURE)
GL.pushMatrix()
GL.scale(4F, 2F, 1F)
GL.matrixMode(GL_MODELVIEW)
}
else{
bindTexture(TEX_PLATE)
}
val state = tile.pos.getState(tile.world)
if (state.block !== ModBlocks.IGNEOUS_PLATE){
return
}
GL.pushMatrix()
GL.translate(x, y, z)
when(state[BlockIgneousPlate.FACING_NOT_DOWN]){
UP -> {
GL.translate(0F, 0F, 1F)
GL.rotate(-90F, 1F, 0F, 0F)
}
NORTH -> {
GL.translate(1F, 0F, 1F)
GL.rotate(180F, 0F, 1F, 0F)
}
WEST -> {
GL.translate(1F, 0F, 0F)
GL.rotate(-90F, 0F, 1F, 0F)
}
EAST -> {
GL.translate(0F, 0F, 1F)
GL.rotate(90F, 0F, 1F, 0F)
}
else -> {}
}
GL.enableRescaleNormal()
GL.color(1F, 1F, 1F, alpha)
if (destroyStage < 0){
ModelBlockIgneousPlate.renderOuterBox()
val (r, g, b) = getInnerBoxColor(tile.clientCombinedHeat)
GL.color(r.toFloat(), g.toFloat(), b.toFloat(), alpha)
}
GL.disableLighting()
ModelBlockIgneousPlate.renderInnerBox(tile.clientThrustAnimation.get(partialTicks))
GL.enableLighting()
GL.disableRescaleNormal()
GL.popMatrix()
if (destroyStage >= 0){
GL.matrixMode(GL_TEXTURE)
GL.popMatrix()
GL.matrixMode(GL_MODELVIEW)
}
}
}
@@ -0,0 +1,128 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.game.block.BlockJarODust
import chylex.hee.game.block.entity.TileEntityJarODust
import chylex.hee.game.mechanics.dust.DustLayers
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.floorToInt
import chylex.hee.system.util.getListOfCompounds
import chylex.hee.system.util.heeTagOrNull
import net.minecraft.block.Block
import net.minecraft.client.renderer.RenderHelper
import net.minecraft.client.renderer.tileentity.TileEntityItemStackRenderer
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.item.ItemStack
import org.lwjgl.opengl.GL11.GL_QUADS
@Sided(Side.CLIENT)
object RenderTileJarODust : TileEntitySpecialRenderer<TileEntityJarODust>(){
private val TEX_LAYER = Resource.Custom("textures/entity/dust_layer.png")
private const val TEX_MP = 1.6
private val AABB = BlockJarODust.AABB
private const val EPSILON_Y = 0.025
private const val EPSILON_XZ = 0.005
override fun render(tile: TileEntityJarODust, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
GL.color(1F, 1F, 1F, alpha)
RenderHelper.disableStandardItemLighting()
renderLayers(tile.layers, x, y, z)
}
private fun renderLayers(layers: DustLayers, x: Double, y: Double, z: Double){ // TODO could work as FastTESR
val contents = layers.contents.takeUnless { it.isEmpty() } ?: return
val unit = AABB.let { it.maxY - it.minY - (EPSILON_Y * 2) } / layers.totalCapacity
MC.textureManager.bindTexture(TEX_LAYER)
GL.pushMatrix()
GL.translate(x, y + AABB.minY + EPSILON_Y, z)
val minX = AABB.minX + EPSILON_XZ
val maxX = AABB.maxX - EPSILON_XZ
val minZ = AABB.minZ + EPSILON_XZ
val maxZ = AABB.maxZ - EPSILON_XZ
var minY = 0.0
for((index, info) in contents.withIndex()){
val (dustType, dustAmount) = info
val color = dustType.color
val height = dustAmount * unit
val maxY = minY + height
val texMin = 0.01 + (minY * TEX_MP)
val texMax = 0.01 + (maxY * TEX_MP)
val sideR = (color[0] / 1.125F).floorToInt().coerceAtLeast(0)
val sideG = (color[1] / 1.125F).floorToInt().coerceAtLeast(0)
val sideB = (color[2] / 1.125F).floorToInt().coerceAtLeast(0)
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR){
pos(minX, minY, minZ).tex(texMin, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, minY, maxZ).tex(texMin, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, maxY, maxZ).tex(texMax, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, maxY, minZ).tex(texMax, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, minY, maxZ).tex(texMin, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, minY, minZ).tex(texMin, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, maxY, minZ).tex(texMax, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, maxY, maxZ).tex(texMax, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, minY, minZ).tex(texMin, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, minY, minZ).tex(texMin, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, maxY, minZ).tex(texMax, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, maxY, minZ).tex(texMax, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, minY, maxZ).tex(texMin, 0.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, minY, maxZ).tex(texMin, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(maxX, maxY, maxZ).tex(texMax, 1.0).color(sideR, sideG, sideB, 255).endVertex()
pos(minX, maxY, maxZ).tex(texMax, 0.0).color(sideR, sideG, sideB, 255).endVertex()
}
if (index == contents.lastIndex){
val topR = (color[0] * 1.125F).floorToInt().coerceAtMost(255)
val topG = (color[1] * 1.125F).floorToInt().coerceAtMost(255)
val topB = (color[2] * 1.125F).floorToInt().coerceAtMost(255)
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR){
pos(minX, maxY, minZ).tex(0.0, 0.0).color(topR, topG, topB, 255).endVertex()
pos(minX, maxY, maxZ).tex(0.0, 1.0).color(topR, topG, topB, 255).endVertex()
pos(maxX, maxY, maxZ).tex(1.0, 1.0).color(topR, topG, topB, 255).endVertex()
pos(maxX, maxY, minZ).tex(1.0, 0.0).color(topR, topG, topB, 255).endVertex()
}
}
minY = maxY
}
GL.popMatrix()
}
// TODO not implemented at the moment
object AsItem : TileEntityItemStackRenderer(){
private val layers = DustLayers(TileEntityJarODust.DUST_CAPACITY)
override fun renderByItem(stack: ItemStack, partialTicks: Float){
val dispatcher = MC.instance.blockRendererDispatcher
val state = Block.getBlockFromItem(stack.item).defaultState
val model = dispatcher.blockModelShapes.getModelForState(state)
dispatcher.blockModelRenderer.renderModelBrightness(model, state, 1F, true)
stack.heeTagOrNull?.getListOfCompounds(BlockJarODust.LAYERS_TAG)?.let {
layers.deserializeNBT(it)
renderLayers(layers, 0.0, 0.0, 0.0)
}
}
}
}
@@ -0,0 +1,21 @@
package chylex.hee.client.render.block
import chylex.hee.game.block.entity.TileEntityLootChest
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.renderer.tileentity.TileEntityItemStackRenderer
import net.minecraft.client.renderer.tileentity.TileEntityRendererDispatcher
import net.minecraft.item.ItemStack
@Sided(Side.CLIENT)
object RenderTileLootChest : RenderTileAbstractChest<TileEntityLootChest>(){
override val texture = Resource.Custom("textures/entity/loot_chest.png")
object AsItem : TileEntityItemStackRenderer(){
private val tile = TileEntityLootChest()
override fun renderByItem(stack: ItemStack, partialTicks: Float){
TileEntityRendererDispatcher.instance.render(tile, 0.0, 0.0, 0.0, partialTicks)
}
}
}
@@ -0,0 +1,39 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.ItemRenderHelper
import chylex.hee.client.util.MC
import chylex.hee.game.block.entity.TileEntityMinersBurialAltar
import chylex.hee.init.ModItems
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.GROUND
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.item.ItemStack
import net.minecraftforge.client.ForgeHooksClient
@Sided(Side.CLIENT)
object RenderTileMinersBurialAltar : TileEntitySpecialRenderer<TileEntityMinersBurialAltar>(){
private val PUZZLE_MEDALLION = ItemStack(ModItems.PUZZLE_MEDALLION)
private const val SCALE_XZ = 1.85F
override fun render(tile: TileEntityMinersBurialAltar, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
if (!tile.hasMedallion){
return
}
ItemRenderHelper.beginItemModel()
GL.pushMatrix()
GL.translate(x, y, z)
GL.pushMatrix()
GL.translate(0.5F, 0.7725F - (0.035F * tile.clientMedallionAnimProgress), 0.625F + 0.125F * (SCALE_XZ - 1F))
GL.rotate(270F, 1F, 0F, 0F)
GL.scale(SCALE_XZ, SCALE_XZ, 1.5F)
MC.itemRenderer.renderItem(PUZZLE_MEDALLION, ForgeHooksClient.handleCameraTransforms(ItemRenderHelper.getItemModel(PUZZLE_MEDALLION), GROUND, false))
GL.popMatrix()
GL.popMatrix()
ItemRenderHelper.endItemModel()
}
}
@@ -0,0 +1,28 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.util.MC
import chylex.hee.game.block.entity.base.TileEntityBaseSpawner
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import kotlin.math.max
@Sided(Side.CLIENT)
object RenderTileSpawner : TileEntitySpecialRenderer<TileEntityBaseSpawner>(){
override fun render(tile: TileEntityBaseSpawner, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
val entity = tile.clientEntity
val scale = 0.53125F / max(entity.width, entity.height).coerceAtLeast(1F)
GL.pushMatrix()
GL.translate(x + 0.5, y + 0.4, z + 0.5)
GL.rotate(tile.clientRotation.get(partialTicks) * 10F, 0F, 1F, 0F)
GL.translate(0F, -0.2F, 0F)
GL.rotate(-30F, 1F, 0F, 0F)
GL.scale(scale, scale, scale)
entity.setLocationAndAngles(x, y, z, 0F, 0F)
MC.renderManager.renderEntity(entity, 0.0, 0.0, 0.0, 0F, partialTicks, false)
GL.popMatrix()
}
}
@@ -0,0 +1,70 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.ItemRenderHelper
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.game.block.entity.TileEntityJarODust
import chylex.hee.game.block.entity.base.TileEntityBaseTable
import chylex.hee.game.mechanics.dust.DustLayers
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.Vec3
import chylex.hee.system.util.addY
import chylex.hee.system.util.center
import chylex.hee.system.util.color.IntColor.Companion.RGBA
import chylex.hee.system.util.getTile
import chylex.hee.system.util.lookPosVec
import net.minecraft.client.renderer.OpenGlHelper
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.GUI
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.item.ItemStack
import net.minecraftforge.client.ForgeHooksClient
import net.minecraftforge.client.model.pipeline.LightUtil
import org.lwjgl.opengl.GL11.GL_QUADS
@Sided(Side.CLIENT)
object RenderTileTable : TileEntitySpecialRenderer<TileEntityBaseTable>(){
private val COLOR = RGBA(180, 180, 180, 120).i
private const val Y_OFFSET = 0.8F
override fun render(tile: TileEntityBaseTable, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
val dustType = tile.tableDustType ?: return
if (tile.pos.up().getTile<TileEntityJarODust>(world)?.layers?.getDustType(DustLayers.Side.BOTTOM) == dustType){
return
}
ItemRenderHelper.beginItemModel()
GL.pushMatrix()
GL.translate(x, y, z)
GL.pushMatrix()
val rotation = (MC.systemTime % 360000L) / 25F
val center = tile.pos.center.addY(Y_OFFSET.toDouble())
val flip = if (center.subtract(MC.player!!.lookPosVec).dotProduct(Vec3.fromYaw(360F - rotation)) > 0.0) 180F else 0F
GL.translate(0.5F, 0.5F + Y_OFFSET, 0.5F)
GL.rotate(rotation + flip, 0F, 1F, 0F)
GL.scale(0.5F, 0.5F, 0.02F)
val itemStack = ItemStack(dustType.item)
val itemModel = ForgeHooksClient.handleCameraTransforms(ItemRenderHelper.getItemModel(itemStack), GUI, false)
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 61680F, 0F)
GL.translate(-0.5F, -0.5F, -0.5F)
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.ITEM){
val quads = itemModel.getQuads(null, null, 0L)
for(quad in quads){
LightUtil.renderQuadColor(this, quad, COLOR)
}
}
GL.popMatrix()
GL.popMatrix()
ItemRenderHelper.endItemModel()
}
}
@@ -0,0 +1,180 @@
package chylex.hee.client.render.block
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.ItemRenderHelper
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.game.block.BlockTablePedestal
import chylex.hee.game.block.entity.TileEntityTablePedestal
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.nextFloat
import chylex.hee.system.util.size
import chylex.hee.system.util.square
import chylex.hee.system.util.toRadians
import net.minecraft.client.renderer.RenderItem
import net.minecraft.client.renderer.block.model.IBakedModel
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.GROUND
import net.minecraft.client.renderer.texture.TextureManager
import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.item.Item
import net.minecraft.item.ItemStack
import net.minecraftforge.client.ForgeHooksClient
import org.lwjgl.opengl.GL11.GL_ALWAYS
import org.lwjgl.opengl.GL11.GL_GREATER
import org.lwjgl.opengl.GL11.GL_QUADS
import java.util.Collections
import java.util.Random
import kotlin.math.cos
import kotlin.math.sin
@Sided(Side.CLIENT)
object RenderTileTablePedestal : TileEntitySpecialRenderer<TileEntityTablePedestal>(){
private val TEX_SHADOW = Resource.Vanilla("textures/misc/shadow.png")
private val RAND = Random()
private const val SHADOW_XZ_MIN = 0.325
private const val SHADOW_XZ_MAX = 0.675
private val SHADOW_Y = BlockTablePedestal.COMBINED_BOX.maxY + 0.0015625 // between the top of the pedestal and the status indicator
private const val SPREAD_DEPTH_PER_2D_MODEL = 0.09375F
private const val SPREAD_RAND_2D = 0.13125F
private const val SPREAD_RAND_3D_XZ = 0.2625F
private const val SPREAD_RAND_3D_Y = 0.39375F
private val ITEM_ANGLES = (1..9).run {
val section = 360F / endInclusive
map { (it - 0.5F) * section }
}
private fun getItemModelCount(stackSize: Int) = when{
stackSize > 48 -> 5
stackSize > 32 -> 4
stackSize > 16 -> 3
stackSize > 1 -> 2
else -> 1
}
override fun render(tile: TileEntityTablePedestal, x: Double, y: Double, z: Double, partialTicks: Float, destroyStage: Int, alpha: Float){
val textureManager = MC.textureManager
val itemRenderer = MC.itemRenderer
ItemRenderHelper.beginItemModel()
GL.pushMatrix()
GL.translate(x, y, z)
val pos = tile.pos
val stacks = tile.stacksForRendering
val itemRotation = (MC.systemTime % 360000L) / 20F
val baseSeed = pos.toLong()
val offsetAngleIndices = if (stacks.size <= 1)
Collections.emptyList()
else
ITEM_ANGLES.toMutableList()
val shadowAlpha = if (MC.settings.entityShadows)
(0.25 * world.getLightBrightness(pos) * (1.0 - (square(x) + square(y) + square(z)) / 256.0)).toFloat().coerceAtMost(1F)
else
0F
for((index, stack) in stacks.withIndex()){
renderItemStack(textureManager, itemRenderer, stack, index, itemRotation, baseSeed, offsetAngleIndices, shadowAlpha)
}
GL.popMatrix()
ItemRenderHelper.endItemModel()
}
private fun renderItemStack(textureManager: TextureManager, renderer: RenderItem, stack: ItemStack, index: Int, baseRotation: Float, baseSeed: Long, offsetAngleIndices: MutableList<Float>, shadowAlpha: Float){
GL.pushMatrix()
var offsetY = 0F
var rotationMp = 1F
if (index > 0 && offsetAngleIndices.isNotEmpty()){
val seed = baseSeed + ((Item.getIdFromItem(stack.item) + stack.metadata) xor (33867 shl index))
RAND.setSeed(seed)
val locDistance = RAND.nextFloat(0.26F, 0.29F)
val locIndex = RAND.nextInt(offsetAngleIndices.size)
val locAngle = (offsetAngleIndices.removeAt(locIndex) + RAND.nextFloat(-3F, 3F)).toRadians()
GL.translate(cos(locAngle) * locDistance, 0F, sin(locAngle) * locDistance)
offsetY = RAND.nextFloat(0F, 0.05F)
rotationMp = RAND.nextFloat(0.4F, 1.2F)
}
if (shadowAlpha > 0F){
GL.depthMask(false)
GL.alphaFunc(GL_ALWAYS, 0F)
textureManager.bindTexture(TEX_SHADOW)
renderShadow(shadowAlpha)
GL.depthMask(true)
GL.alphaFunc(GL_GREATER, 0.1F)
textureManager.bindTexture(ItemRenderHelper.TEX_BLOCKS_ITEMS)
}
val baseModel = ItemRenderHelper.getItemModel(stack)
val isModel3D = baseModel.isGui3d
val baseY = if (isModel3D) 0.8325F else 1F
GL.translate(0.5F, baseY + offsetY, 0.5F)
GL.rotate(baseRotation * rotationMp, 0F, 1F, 0F)
renderItemWithSpread(renderer, stack, ForgeHooksClient.handleCameraTransforms(baseModel, GROUND, false), isModel3D)
GL.popMatrix()
}
private fun renderItemWithSpread(renderer: RenderItem, stack: ItemStack, model: IBakedModel, isModel3D: Boolean){
val extraModels = getItemModelCount(stack.size) - 1
if (extraModels > 0){
RAND.setSeed((Item.getIdFromItem(stack.item) + stack.metadata).toLong())
if (!isModel3D){
GL.translate(0F, 0F, -SPREAD_DEPTH_PER_2D_MODEL * (extraModels / 2F))
}
}
renderer.renderItem(stack, model)
repeat(extraModels){
GL.pushMatrix()
if (isModel3D){
GL.translate(
RAND.nextFloat(-SPREAD_RAND_3D_XZ, SPREAD_RAND_3D_XZ),
RAND.nextFloat(-SPREAD_RAND_3D_Y, SPREAD_RAND_3D_Y),
RAND.nextFloat(-SPREAD_RAND_3D_XZ, SPREAD_RAND_3D_XZ)
)
}
else{
GL.translate(
RAND.nextFloat(-SPREAD_RAND_2D, SPREAD_RAND_2D),
RAND.nextFloat(-SPREAD_RAND_2D, SPREAD_RAND_2D),
SPREAD_DEPTH_PER_2D_MODEL * (it + 1)
)
}
renderer.renderItem(stack, model)
GL.popMatrix()
}
}
private fun renderShadow(alpha: Float){
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR){
pos(SHADOW_XZ_MIN, SHADOW_Y, SHADOW_XZ_MIN).tex(0.0, 0.0).color(1F, 1F, 1F, alpha).endVertex()
pos(SHADOW_XZ_MIN, SHADOW_Y, SHADOW_XZ_MAX).tex(0.0, 1.0).color(1F, 1F, 1F, alpha).endVertex()
pos(SHADOW_XZ_MAX, SHADOW_Y, SHADOW_XZ_MAX).tex(1.0, 1.0).color(1F, 1F, 1F, alpha).endVertex()
pos(SHADOW_XZ_MAX, SHADOW_Y, SHADOW_XZ_MIN).tex(1.0, 0.0).color(1F, 1F, 1F, alpha).endVertex()
}
}
}
@@ -0,0 +1,41 @@
package chylex.hee.client.render.block
import chylex.hee.game.block.BlockAbstractPortal
import chylex.hee.game.block.BlockVoidPortalInner.Companion.TYPE
import chylex.hee.game.block.BlockVoidPortalInner.IVoidPortalController
import chylex.hee.game.block.BlockVoidPortalInner.Type.HUB
import chylex.hee.game.block.BlockVoidPortalInner.Type.RETURN_ACTIVE
import chylex.hee.game.block.entity.TileEntityPortalInner
import chylex.hee.game.block.entity.TileEntityVoidPortalStorage
import chylex.hee.game.world.territory.TerritoryInstance.Companion.THE_HUB_INSTANCE
import chylex.hee.init.ModBlocks
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.closestTickingTile
import chylex.hee.system.util.get
import chylex.hee.system.util.getState
import chylex.hee.system.util.math.LerpedFloat
import net.minecraft.util.math.BlockPos
import net.minecraft.world.World
@Sided(Side.CLIENT)
object RenderTileVoidPortal : RenderTileAbstractPortal<TileEntityPortalInner.Void, IVoidPortalController>(){
private object ActiveReturnController : IVoidPortalController{
override val currentInstance = THE_HUB_INSTANCE
override val clientAnimationProgress = LerpedFloat(1F)
override val clientPortalOffset = LerpedFloat(0F)
}
override fun findController(world: World, pos: BlockPos) = when(pos.getState(world).takeIf { it.block === ModBlocks.VOID_PORTAL_INNER }?.get(TYPE)){
HUB -> pos.closestTickingTile<TileEntityVoidPortalStorage>(world, BlockAbstractPortal.MAX_DISTANCE_FROM_FRAME)
RETURN_ACTIVE -> ActiveReturnController
else -> null
}
override fun generateSeed(controller: IVoidPortalController): Long{
return controller.currentInstance?.territory?.desc?.colors?.portalSeed ?: 0L
}
override fun generateNextColor(controller: IVoidPortalController, layer: Int){
controller.currentInstance?.territory?.desc?.colors?.nextPortalColor(rand, color)
}
}
@@ -0,0 +1,25 @@
package chylex.hee.client.render.entity
import chylex.hee.client.model.entity.ModelEntityBossEnderEye
import chylex.hee.client.model.entity.ModelEntityBossEnderEye.SCALE
import chylex.hee.client.render.util.GL
import chylex.hee.game.entity.living.EntityBossEnderEye
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.renderer.entity.RenderLiving
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.util.ResourceLocation
@Sided(Side.CLIENT)
class RenderEntityBossEnderEye(manager: RenderManager) : RenderLiving<EntityBossEnderEye>(manager, ModelEntityBossEnderEye, SCALE){
private val texture = Resource.Custom("textures/entity/ender_eye.png")
override fun preRenderCallback(entity: EntityBossEnderEye, partialTicks: Float){
GL.scale(SCALE, SCALE, SCALE)
super.preRenderCallback(entity, partialTicks)
}
override fun getEntityTexture(entity: EntityBossEnderEye): ResourceLocation{
return texture
}
}
@@ -0,0 +1,11 @@
package chylex.hee.client.render.entity
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.entity.RenderEntityItem
import net.minecraft.client.renderer.entity.RenderManager
@Sided(Side.CLIENT)
class RenderEntityItemNoBob(manager: RenderManager) : RenderEntityItem(manager, MC.itemRenderer){
override fun shouldBob() = false
}
@@ -0,0 +1,77 @@
package chylex.hee.client.render.entity
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.game.entity.living.EntityMobAbstractEnderman
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.nextFloat
import chylex.hee.system.util.totalTime
import net.minecraft.client.renderer.entity.RenderEnderman
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.entity.monster.EntityEnderman
import org.lwjgl.opengl.GL11.GL_GREATER
import java.util.Random
@Sided(Side.CLIENT)
open class RenderEntityMobAbstractEnderman(manager: RenderManager) : RenderEnderman(manager){
private val rand = Random()
override fun doRender(entity: EntityEnderman, x: Double, y: Double, z: Double, rotationYaw: Float, partialTicks: Float){
if (entity !is EntityMobAbstractEnderman){
return
}
if (entity.isShaking){
rand.setSeed(entity.world.totalTime)
super.doRender(entity, x + (rand.nextGaussian() * 0.01), y + (rand.nextGaussian() * 0.01), z + (rand.nextGaussian() * 0.01), rotationYaw, partialTicks)
}
else{
super.doRender(entity, x, y, z, rotationYaw, partialTicks)
}
val cloneCount = getCloneCount(entity)
if (cloneCount > 0){
rand.setSeed(entity.world.totalTime * 2L / 3L)
val prevPrevYaw = entity.prevRotationYawHead
val prevYaw = entity.rotationYawHead
val prevPrevPitch = entity.prevRotationPitch
val prevPitch = entity.rotationPitch
repeat(cloneCount){
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA)
GL.alphaFunc(GL_GREATER, 0.004F)
GL.depthMask(false)
GL.color(1F, 1F, 1F, rand.nextFloat(0.05F, 0.3F))
if (rand.nextInt(3) == 0){
entity.rotationYawHead += rand.nextFloat(-45F, 45F)
entity.prevRotationYawHead = entity.rotationYawHead
entity.rotationPitch += rand.nextFloat(-30F, 30F)
entity.prevRotationPitch = entity.rotationPitch
}
super.doRender(entity, x + rand.nextGaussian() * 0.04, y + rand.nextGaussian() * 0.025, z + rand.nextGaussian() * 0.04, rotationYaw, partialTicks)
}
entity.prevRotationYawHead = prevPrevYaw
entity.rotationYawHead = prevYaw
entity.prevRotationPitch = prevPrevPitch
entity.rotationPitch = prevPitch
GL.depthMask(true)
GL.alphaFunc(GL_GREATER, 0.1F)
GL.disableBlend()
}
}
protected open fun getCloneCount(entity: EntityMobAbstractEnderman): Int{
return if (entity.hurtTime == 0 && entity.isAggressive) 2 else 0
}
}
@@ -0,0 +1,14 @@
package chylex.hee.client.render.entity
import chylex.hee.game.entity.living.EntityMobAbstractEnderman
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.entity.RenderManager
@Sided(Side.CLIENT)
class RenderEntityMobAngryEnderman(manager: RenderManager) : RenderEntityMobAbstractEnderman(manager){
override fun getCloneCount(entity: EntityMobAbstractEnderman) = when{
entity.hurtTime != 0 -> 0
entity.isAggressive -> 2
else -> 1
}
}
@@ -0,0 +1,33 @@
package chylex.hee.client.render.entity
import chylex.hee.client.render.entity.layer.LayerSpiderlingEyes
import chylex.hee.client.render.util.GL
import chylex.hee.game.entity.living.EntityMobSpiderling
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.model.ModelSpider
import net.minecraft.client.renderer.entity.RenderLiving
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.util.ResourceLocation
@Sided(Side.CLIENT)
class RenderEntityMobSpiderling(manager: RenderManager) : RenderLiving<EntityMobSpiderling>(manager, ModelSpider(), 0.5F){
private val texture = Resource.Custom("textures/entity/spiderling.png")
init{
addLayer(LayerSpiderlingEyes(this, (mainModel as ModelSpider).spiderHead))
}
override fun preRenderCallback(entity: EntityMobSpiderling, partialTicks: Float){
GL.scale(0.5F, 0.5F, 0.5F)
super.preRenderCallback(entity, partialTicks)
}
override fun getEntityTexture(entity: EntityMobSpiderling): ResourceLocation{
return texture
}
override fun getDeathMaxRotation(entity: EntityMobSpiderling): Float{
return 180F
}
}
@@ -0,0 +1,39 @@
package chylex.hee.client.render.entity
import chylex.hee.client.render.util.GL
import chylex.hee.game.entity.living.EntityMobUndread
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.model.ModelZombie
import net.minecraft.client.renderer.entity.RenderBiped
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.client.renderer.entity.layers.LayerBipedArmor
import net.minecraft.util.ResourceLocation
@Sided(Side.CLIENT)
class RenderEntityMobUndread(manager: RenderManager) : RenderBiped<EntityMobUndread>(manager, ModelZombie(), 0.5F){
private val texture = Resource.Custom("textures/entity/undread.png")
init{
addLayer(object : LayerBipedArmor(this){
override fun initArmor(){
modelLeggings = ModelZombie(0.5125F, true)
modelArmor = ModelZombie(1F, true)
}
})
}
override fun preRenderCallback(entity: EntityMobUndread, partialTicks: Float){
GL.scale(1.025F, 0.965F, 1.025F)
super.preRenderCallback(entity, partialTicks)
}
override fun getEntityTexture(entity: EntityMobUndread): ResourceLocation{
return texture
}
override fun getDeathMaxRotation(entity: EntityMobUndread): Float{
val uuid = entity.uniqueID
return 15F * (if ((uuid.leastSignificantBits % 2L) xor (uuid.mostSignificantBits % 2L) == 0L) 1F else -1F)
}
}
@@ -0,0 +1,17 @@
package chylex.hee.client.render.entity
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.renderer.entity.RenderBat
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.entity.passive.EntityBat
import net.minecraft.util.ResourceLocation
@Sided(Side.CLIENT)
class RenderEntityMobVampireBat(manager: RenderManager) : RenderBat(manager){
private val texture = Resource.Custom("textures/entity/vampire_bat.png")
override fun getEntityTexture(entity: EntityBat): ResourceLocation{
return texture
}
}
@@ -0,0 +1,57 @@
package chylex.hee.client.render.entity
import chylex.hee.client.render.util.GL
import chylex.hee.game.entity.living.EntityMobVillagerDying
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.totalTime
import net.minecraft.client.model.ModelVillager
import net.minecraft.client.renderer.entity.RenderLiving
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.util.ResourceLocation
import java.util.Random
import kotlin.math.min
@Sided(Side.CLIENT)
class RenderEntityMobVillagerDying(manager: RenderManager) : RenderLiving<EntityMobVillagerDying>(manager, ModelVillager(0F), 0.5F){
private val rand = Random()
override fun doRender(entity: EntityMobVillagerDying, x: Double, y: Double, z: Double, rotationYaw: Float, partialTicks: Float){
rand.setSeed(entity.world.totalTime)
val mp = min(1F, entity.deathTime / 50F) * 0.005F
super.doRender(entity, x + (rand.nextGaussian() * mp), y + (rand.nextGaussian() * mp), z + (rand.nextGaussian() * mp), rotationYaw, partialTicks)
}
override fun getEntityTexture(entity: EntityMobVillagerDying): ResourceLocation?{
return entity.profession?.skin
}
override fun preRenderCallback(entity: EntityMobVillagerDying, partialTicks: Float){
val scale: Float
if (entity.isChild){
scale = 0.46875F
shadowSize = 0.25F
}
else{
scale = 0.9375F
shadowSize = 0.5F
}
GL.scale(scale, scale, scale)
}
override fun setBrightness(entity: EntityMobVillagerDying, partialTicks: Float, combineTextures: Boolean): Boolean{
val prevDeathTime = entity.deathTime
entity.deathTime = 0
val result = super.setBrightness(entity, partialTicks, combineTextures)
entity.deathTime = prevDeathTime
return result
}
override fun getDeathMaxRotation(entity: EntityMobVillagerDying): Float{
return 0F
}
}
@@ -0,0 +1,14 @@
package chylex.hee.client.render.entity
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.culling.ICamera
import net.minecraft.client.renderer.entity.Render
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.entity.Entity
import net.minecraft.util.ResourceLocation
@Sided(Side.CLIENT)
class RenderEntityNothing(manager: RenderManager) : Render<Entity>(manager){
override fun shouldRender(entity: Entity, camera: ICamera, camX: Double, camY: Double, camZ: Double) = false
override fun getEntityTexture(entity: Entity): ResourceLocation? = null
}
@@ -0,0 +1,51 @@
package chylex.hee.client.render.entity
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.ItemRenderHelper
import chylex.hee.client.util.MC
import chylex.hee.game.entity.projectile.EntityProjectileEyeOfEnder
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.migration.vanilla.Items
import net.minecraft.client.renderer.block.model.ItemCameraTransforms.TransformType.GROUND
import net.minecraft.client.renderer.entity.Render
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.item.ItemStack
import net.minecraft.util.ResourceLocation
import net.minecraftforge.client.ForgeHooksClient
@Sided(Side.CLIENT)
class RenderEntityProjectileEyeOfEnder(manager: RenderManager) : Render<EntityProjectileEyeOfEnder>(manager){
private companion object{
private val RENDERED_ITEM = ItemStack(Items.ENDER_EYE)
}
override fun doRender(entity: EntityProjectileEyeOfEnder, x: Double, y: Double, z: Double, rotationYaw: Float, partialTicks: Float){
ItemRenderHelper.beginItemModel()
GL.pushMatrix()
GL.translate(x, y + entity.renderBob.get(partialTicks), z)
GL.rotate(rotationYaw, 0F, 1F, 0F)
GL.color(1F, 1F, 1F, 1F)
if (renderOutlines){
GL.enableColorMaterial()
GL.enableOutlineMode(getTeamColor(entity))
}
MC.itemRenderer.renderItem(RENDERED_ITEM, ForgeHooksClient.handleCameraTransforms(ItemRenderHelper.getItemModel(RENDERED_ITEM), GROUND, false))
if (renderOutlines){
GL.disableOutlineMode()
GL.disableColorMaterial()
}
GL.popMatrix()
ItemRenderHelper.endItemModel()
super.doRender(entity, x, y, z, rotationYaw, partialTicks)
}
override fun getEntityTexture(entity: EntityProjectileEyeOfEnder): ResourceLocation{
return ItemRenderHelper.TEX_BLOCKS_ITEMS
}
}
@@ -0,0 +1,54 @@
package chylex.hee.client.render.entity
import chylex.hee.client.model.entity.ModelEntityTokenHolder
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.game.entity.item.EntityTokenHolder
import chylex.hee.game.item.ItemPortalToken.TokenType.NORMAL
import chylex.hee.game.item.ItemPortalToken.TokenType.RARE
import chylex.hee.game.item.ItemPortalToken.TokenType.SOLITARY
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.renderer.entity.Render
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.util.ResourceLocation
import kotlin.math.pow
@Sided(Side.CLIENT)
class RenderEntityTokenHolder(manager: RenderManager) : Render<EntityTokenHolder>(manager){
private val textures = mapOf(
NORMAL to Resource.Custom("textures/entity/token_holder.png"),
RARE to Resource.Custom("textures/entity/token_holder_rare.png"),
SOLITARY to Resource.Custom("textures/entity/token_holder_solitary.png")
)
override fun doRender(entity: EntityTokenHolder, x: Double, y: Double, z: Double, rotationYaw: Float, partialTicks: Float){
val charge = entity.renderCharge.get(partialTicks)
val scale = 0.25F + (0.25F * charge.pow(1.5F))
val alpha = 0.35F + (0.475F * charge.pow(5.5F))
GL.pushMatrix()
GL.translate(x, y + (entity.height * 0.5F), z)
GL.pushMatrix()
GL.scale(scale, scale, scale)
GL.rotate(entity.renderRotation.get(partialTicks), 0F, 1F, 0F)
GL.rotate(55F, 1F, 0F, 1F)
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA)
GL.color(1F, 1F, 1F, alpha)
bindEntityTexture(entity)
ModelEntityTokenHolder.render()
GL.popMatrix()
GL.disableBlend()
GL.popMatrix()
}
override fun getEntityTexture(entity: EntityTokenHolder): ResourceLocation?{
return textures[entity.tokenType]
}
}
@@ -0,0 +1,20 @@
package chylex.hee.client.render.entity.layer
import chylex.hee.client.render.block.RenderTileEndermanHead
import chylex.hee.init.ModItems
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.model.ModelRenderer
import net.minecraft.client.renderer.entity.layers.LayerRenderer
import net.minecraft.entity.player.EntityPlayer
import net.minecraft.inventory.EntityEquipmentSlot.HEAD
@Sided(Side.CLIENT)
class LayerEndermanHead(private val headModel: ModelRenderer) : LayerRenderer<EntityPlayer>{
override fun doRenderLayer(entity: EntityPlayer, limbSwing: Float, limbSwingAmount: Float, partialTicks: Float, entityTickTime: Float, rotationYaw: Float, rotationPitch: Float, scale: Float){
if (entity.getItemStackFromSlot(HEAD).item === ModItems.ENDERMAN_HEAD){
RenderTileEndermanHead.AsHeadLayer(entity, headModel)
}
}
override fun shouldCombineTextures() = false
}
@@ -0,0 +1,55 @@
package chylex.hee.client.render.entity.layer
import chylex.hee.client.render.entity.RenderEntityMobSpiderling
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.util.MC
import chylex.hee.game.entity.living.EntityMobSpiderling
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import net.minecraft.client.model.ModelRenderer
import net.minecraft.client.renderer.OpenGlHelper
import net.minecraft.client.renderer.entity.layers.LayerRenderer
@Sided(Side.CLIENT)
class LayerSpiderlingEyes(private val spiderlingRenderer: RenderEntityMobSpiderling, private val headRenderer: ModelRenderer) : LayerRenderer<EntityMobSpiderling>{
private val texture = Resource.Custom("textures/entity/spiderling_eyes.png")
override fun doRenderLayer(entity: EntityMobSpiderling, limbSwing: Float, limbSwingAmount: Float, partialTicks: Float, ageInTicks: Float, netHeadYaw: Float, headPitch: Float, scale: Float){
if (entity.isSleeping){
return
}
spiderlingRenderer.bindTexture(texture)
GL.color(1F, 1F, 1F, 1F)
GL.disableAlpha()
GL.enableBlend()
GL.blendFunc(SF_ONE, DF_ONE)
GL.depthMask(!entity.isInvisible)
OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 61680F, 0F)
MC.entityRenderer.setupFogColor(true)
if (headPitch == 0F){
GL.pushMatrix()
GL.scale(1.001, 1.001, 1.001) // hack around z-fighting
headRenderer.render(scale)
GL.popMatrix()
}
else{
headRenderer.render(scale)
}
spiderlingRenderer.setLightmap(entity)
MC.entityRenderer.setupFogColor(false)
GL.disableBlend()
GL.enableAlpha()
}
override fun shouldCombineTextures(): Boolean{
return false
}
}
@@ -0,0 +1,11 @@
package chylex.hee.client.render.territory
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.Minecraft
import net.minecraft.client.multiplayer.WorldClient
import net.minecraftforge.client.IRenderHandler
object EmptyRenderer : IRenderHandler(){
@Sided(Side.CLIENT)
override fun render(partialTicks: Float, world: WorldClient, mc: Minecraft){}
}
@@ -0,0 +1,49 @@
package chylex.hee.client.render.territory
import chylex.hee.client.render.TerritoryRenderer
import chylex.hee.client.render.territory.components.SkyCubeStatic
import chylex.hee.client.render.util.GL
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.facades.Resource
import chylex.hee.system.util.remapRange
import net.minecraft.client.Minecraft
import net.minecraft.client.multiplayer.WorldClient
import net.minecraft.client.renderer.EntityRenderer
import net.minecraft.util.math.Vec3d
import net.minecraftforge.client.IRenderHandler
import kotlin.math.pow
class EnvironmentRenderer(private vararg val renderers: IRenderHandler) : IRenderHandler(){
companion object{
val currentSkyAlpha
@Sided(Side.CLIENT)
get() = remapRange(TerritoryRenderer.VOID_FACTOR_VALUE, (-1F)..(0.5F), (1F)..(0F)).coerceIn(0F, 1F)
val currentFogDensityMp
@Sided(Side.CLIENT)
get() = 1F + (9F * remapRange(TerritoryRenderer.VOID_FACTOR_VALUE, (-0.5F)..(1F), (0F)..(1F)).coerceIn(0F, 1F).pow(1.5F))
val VANILLA = EnvironmentRenderer(
SkyCubeStatic(
texture = Resource.Vanilla("textures/environment/end_sky.png"),
color = (40.0 / 255.0).let { Vec3d(it, it, it) },
distance = 100.0
)
)
}
@Sided(Side.CLIENT)
override fun render(partialTicks: Float, world: WorldClient, mc: Minecraft){
if (mc.gameSettings.anaglyph && EntityRenderer.anaglyphField != 0){
return
}
GL.depthMask(false)
for(renderer in renderers){
renderer.render(partialTicks, world, mc)
}
GL.depthMask(true)
}
}
@@ -0,0 +1,78 @@
package chylex.hee.client.render.territory.components
import chylex.hee.client.render.territory.EnvironmentRenderer
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.DF_ZERO
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.Minecraft
import net.minecraft.client.multiplayer.WorldClient
import net.minecraft.client.renderer.RenderHelper
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.Vec3d
import net.minecraftforge.client.IRenderHandler
import org.lwjgl.opengl.GL11.GL_GREATER
import org.lwjgl.opengl.GL11.GL_QUADS
abstract class SkyCubeBase : IRenderHandler(){
protected companion object{
const val DEFAULT_ALPHA = 1F
const val DEFAULT_DISTANCE = 125.0
}
protected abstract val texture: ResourceLocation
protected abstract val color: Vec3d
protected open val alpha = DEFAULT_ALPHA
protected open val distance = DEFAULT_DISTANCE
@Sided(Side.CLIENT)
override fun render(partialTicks: Float, world: WorldClient, mc: Minecraft){
val dist = distance
val col = color
val red = col.x.toFloat()
val green = col.y.toFloat()
val blue = col.z.toFloat()
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA, SF_ONE, DF_ZERO)
GL.enableAlpha()
GL.alphaFunc(GL_GREATER, 0F)
GL.disableFog()
RenderHelper.disableStandardItemLighting()
GL.color(red, green, blue, alpha * EnvironmentRenderer.currentSkyAlpha)
MC.textureManager.bindTexture(texture)
for(side in 0..5){
GL.pushMatrix()
when(side){
1 -> GL.rotate( 90F, 1F, 0F, 0F)
2 -> GL.rotate(-90F, 1F, 0F, 0F)
3 -> GL.rotate(180F, 1F, 0F, 0F)
4 -> GL.rotate( 90F, 0F, 0F, 1F)
5 -> GL.rotate(-90F, 0F, 0F, 1F)
}
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_TEX){
pos(-dist, -dist, -dist).tex( 0.0, 0.0).endVertex()
pos(-dist, -dist, dist).tex( 0.0, 16.0).endVertex()
pos( dist, -dist, dist).tex(16.0, 16.0).endVertex()
pos( dist, -dist, -dist).tex(16.0, 0.0).endVertex()
}
GL.popMatrix()
}
GL.enableFog()
GL.disableAlpha()
GL.disableBlend()
}
}
@@ -0,0 +1,10 @@
package chylex.hee.client.render.territory.components
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.Vec3d
class SkyCubeStatic(
override val texture: ResourceLocation,
override val color: Vec3d,
override val alpha: Float = DEFAULT_ALPHA,
override val distance: Double = DEFAULT_DISTANCE
) : SkyCubeBase()
@@ -0,0 +1,119 @@
package chylex.hee.client.render.territory.components
import chylex.hee.client.render.territory.EnvironmentRenderer
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.square
import net.minecraft.client.Minecraft
import net.minecraft.client.multiplayer.WorldClient
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.Vec3d
import net.minecraftforge.client.IRenderHandler
import org.lwjgl.opengl.GL11.GL_FLAT
import org.lwjgl.opengl.GL11.GL_GREATER
import org.lwjgl.opengl.GL11.GL_QUADS
import org.lwjgl.opengl.GL11.GL_SMOOTH
import kotlin.math.pow
import kotlin.math.sqrt
abstract class SkyDomeBase : IRenderHandler(){
@Sided(Side.CLIENT)
private object Skybox{
data class Vertex(val x: Float, val y: Float, val z: Float, val u: Float, val v: Float, val c: Float)
private const val SIZE = 8
private const val COUNT = 15
private fun yOffset(xp: Float, zp: Float): Float{
return 32F - (1.15F * (square(xp) + square(zp)).pow(0.75F))
}
private fun yColor(xp: Float, zp: Float): Float{
val distance = sqrt(square(xp) + square(zp)) / (COUNT - 2F)
val stretched = 1F - ((distance - 0.4F) / 0.6F)
return stretched.coerceIn(0F, 1F)
}
val VERTICES = lazy {
val list = mutableListOf<Vertex>()
for(xi in -COUNT..COUNT){
for(zi in -COUNT..COUNT){
if (square(xi) + square(zi) < square(COUNT)){
val x1 = ((xi * SIZE) - SIZE / 2).toFloat()
val x2 = ((xi * SIZE) + SIZE / 2).toFloat()
val z1 = ((zi * SIZE) - SIZE / 2).toFloat()
val z2 = ((zi * SIZE) + SIZE / 2).toFloat()
val y11 = yOffset(xi - 0.5F, zi - 0.5F)
val y12 = yOffset(xi - 0.5F, zi + 0.5F)
val y21 = yOffset(xi + 0.5F, zi - 0.5F)
val y22 = yOffset(xi + 0.5F, zi + 0.5F)
val c11 = yColor(xi - 0.5F, zi - 0.5F)
val c12 = yColor(xi - 0.5F, zi + 0.5F)
val c21 = yColor(xi + 0.5F, zi - 0.5F)
val c22 = yColor(xi + 0.5F, zi + 0.5F)
list.add(Vertex(x = x1, y = y11, z = z1, u = 0F, v = 0F, c = c11))
list.add(Vertex(x = x2, y = y21, z = z1, u = 0F, v = 3F, c = c21))
list.add(Vertex(x = x2, y = y22, z = z2, u = 3F, v = 3F, c = c22))
list.add(Vertex(x = x1, y = y12, z = z2, u = 3F, v = 0F, c = c12))
}
}
}
list.toList()
}
}
protected companion object{
const val DEFAULT_ALPHA = 1F
}
protected abstract val texture: ResourceLocation
protected abstract val color: Vec3d
protected open val alpha = DEFAULT_ALPHA
@Sided(Side.CLIENT)
override fun render(partialTicks: Float, world: WorldClient, mc: Minecraft){
val col = color
val alp = alpha * EnvironmentRenderer.currentSkyAlpha
val red = col.x.toFloat()
val green = col.y.toFloat()
val blue = col.z.toFloat()
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA)
GL.enableAlpha()
GL.alphaFunc(GL_GREATER, 0F)
GL.enableFog()
GL.shadeModel(GL_SMOOTH)
GL.enableTexture2D()
MC.textureManager.bindTexture(texture)
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_TEX_COLOR){
for((x, y, z, u, v, c) in Skybox.VERTICES.value){
pos(x.toDouble(), y.toDouble(), z.toDouble())
tex(u.toDouble(), v.toDouble())
color(red * c, green * c, blue * c, alp)
endVertex()
}
}
GL.shadeModel(GL_FLAT)
GL.disableFog()
GL.disableAlpha()
GL.disableBlend()
}
}
@@ -0,0 +1,9 @@
package chylex.hee.client.render.territory.components
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.Vec3d
class SkyDomeStatic(
override val texture: ResourceLocation,
override val color: Vec3d,
override val alpha: Float = DEFAULT_ALPHA
) : SkyDomeBase()
@@ -0,0 +1,73 @@
package chylex.hee.client.render.territory.components
import chylex.hee.client.render.util.GL
import chylex.hee.client.render.util.GL.DF_ONE
import chylex.hee.client.render.util.GL.DF_ZERO
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.render.util.TESSELLATOR
import chylex.hee.client.render.util.draw
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.Minecraft
import net.minecraft.client.multiplayer.WorldClient
import net.minecraft.client.renderer.vertex.DefaultVertexFormats
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.Vec3d
import net.minecraftforge.client.IRenderHandler
import org.lwjgl.opengl.GL11.GL_GREATER
import org.lwjgl.opengl.GL11.GL_QUADS
abstract class SunBase : IRenderHandler(){
protected companion object{
val DEFAULT_COLOR = Vec3d(1.0, 1.0, 1.0)
const val DEFAULT_ALPHA = 1F
const val DEFAULT_DISTANCE = 100.0
}
protected abstract val texture: ResourceLocation
protected open val color = DEFAULT_COLOR
protected open val alpha = DEFAULT_ALPHA
protected abstract val size: Double
protected open val distance = DEFAULT_DISTANCE
protected open fun setRotation(world: WorldClient, partialTicks: Float){
GL.rotate(-90F, 0F, 1F, 0F)
GL.rotate(world.getCelestialAngle(partialTicks) * 360F, 1F, 0F, 0F)
}
@Sided(Side.CLIENT)
override fun render(partialTicks: Float, world: WorldClient, mc: Minecraft){
val width = size
val dist = distance
val col = color
val red = col.x.toFloat()
val green = col.y.toFloat()
val blue = col.z.toFloat()
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE, SF_ONE, DF_ZERO)
GL.enableAlpha()
GL.alphaFunc(GL_GREATER, 0F)
GL.disableFog()
GL.pushMatrix()
setRotation(world, partialTicks)
GL.color(red, green, blue, alpha)
MC.textureManager.bindTexture(texture)
TESSELLATOR.draw(GL_QUADS, DefaultVertexFormats.POSITION_TEX){
pos(-width, dist, -width).tex(0.0, 0.0).endVertex()
pos( width, dist, -width).tex(1.0, 0.0).endVertex()
pos( width, dist, width).tex(1.0, 1.0).endVertex()
pos(-width, dist, width).tex(0.0, 1.0).endVertex()
}
GL.popMatrix()
GL.enableFog()
GL.disableAlpha()
GL.disableBlend()
}
}
@@ -0,0 +1,11 @@
package chylex.hee.client.render.territory.components
import net.minecraft.util.ResourceLocation
import net.minecraft.util.math.Vec3d
class SunStatic(
override val texture: ResourceLocation,
override val color: Vec3d = DEFAULT_COLOR,
override val alpha: Float = DEFAULT_ALPHA,
override val size: Double,
override val distance: Double = DEFAULT_DISTANCE
) : SunBase()
@@ -0,0 +1,15 @@
package chylex.hee.client.render.territory.lightmaps
interface ILightmap{
fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float)
companion object{
fun calcLightFactor(light: Float, mp: Float = 0.6F): Float{
return light * ((((light * mp) + (1F - mp)) * mp) + (1F - mp))
}
fun calcLightSqFactor(light: Float, mp: Float = 0.6F): Float{
return light * ((light * light * mp) + (1F - mp))
}
}
}
@@ -0,0 +1,36 @@
package chylex.hee.client.render.territory.lightmaps
import kotlin.math.max
fun ILightmap.mergeSkyLightIntoBlockLight() = object : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
this@mergeSkyLightIntoBlockLight.update(colors, sunBrightness, skyLight, max(skyLight, blockLight), partialTicks)
}
}
fun ILightmap.transformSunBrightness(transformer: (Float) -> Float) = object : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
this@transformSunBrightness.update(colors, transformer(sunBrightness), skyLight, blockLight, partialTicks)
}
}
fun ILightmap.transformSkyLight(transformer: (Float) -> Float) = object : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
this@transformSkyLight.update(colors, sunBrightness, transformer(skyLight), blockLight, partialTicks)
}
}
fun ILightmap.transformBlockLight(transformer: (Float) -> Float) = object : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
this@transformBlockLight.update(colors, sunBrightness, skyLight, transformer(blockLight), partialTicks)
}
}
fun ILightmap.transformColors(red: (Float) -> Float, green: (Float) -> Float, blue: (Float) -> Float) = object : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
this@transformColors.update(colors, sunBrightness, skyLight, blockLight, partialTicks)
colors[0] = red(colors[0])
colors[1] = green(colors[1])
colors[2] = blue(colors[2])
}
}
@@ -0,0 +1,19 @@
package chylex.hee.client.render.territory.lightmaps
import chylex.hee.client.render.territory.lightmaps.ILightmap.Companion.calcLightFactor
import chylex.hee.client.render.territory.lightmaps.ILightmap.Companion.calcLightSqFactor
object OverworldLightmap : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
val sunFactor = skyLight * ((sunBrightness * 0.65F) + 0.35F)
val blockFactor = calcLightFactor(blockLight)
val blockSqFactor = calcLightSqFactor(blockLight)
val red = sunFactor + blockLight
val green = sunFactor + blockFactor
val blue = skyLight + blockSqFactor
colors[0] = (red * 0.96F) + 0.03F
colors[1] = (green * 0.96F) + 0.03F
colors[2] = (blue * 0.96F) + 0.03F
}
}
@@ -0,0 +1,14 @@
package chylex.hee.client.render.territory.lightmaps
import chylex.hee.client.render.territory.lightmaps.ILightmap.Companion.calcLightFactor
import chylex.hee.client.render.territory.lightmaps.ILightmap.Companion.calcLightSqFactor
object VanillaEndLightmap : ILightmap{
override fun update(colors: FloatArray, sunBrightness: Float, skyLight: Float, blockLight: Float, partialTicks: Float){
val blockFactor = calcLightFactor(blockLight)
val blockSqFactor = calcLightSqFactor(blockLight)
colors[0] = (blockLight * 0.75F) + 0.22F
colors[1] = (blockFactor * 0.75F) + 0.28F
colors[2] = (blockSqFactor * 0.75F) + 0.25F
}
}
@@ -0,0 +1,8 @@
package chylex.hee.client.render.util
import net.minecraft.block.Block
import net.minecraft.client.renderer.color.IBlockColor
import net.minecraft.client.renderer.color.IItemColor
const val NO_TINT = -1
fun IBlockColor.asItem(block: Block) = IItemColor { _, tintIndex -> colorMultiplier(block.defaultState, null, null, tintIndex) }
@@ -0,0 +1,78 @@
package chylex.hee.client.render.util
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import chylex.hee.system.util.color.HCL
@Sided(Side.CLIENT)
class ColorTransition(private val defaultColor: HCL, private val transitionDuration: Float){
private var currentFrom: HCL = defaultColor
private var currentTo: HCL? = null
private var currentProgress = 0F
private val transitionQueue = ArrayList<HCL>(4)
private var lastUpdateTime = 0L
val currentTargetColor
get() = currentTo ?: currentFrom
val lastColorInQueue
get() = transitionQueue.lastOrNull()
fun resetAll(){
resetQueue()
currentFrom = defaultColor
currentTo = null
currentProgress = 0F
lastUpdateTime = MC.systemTime
}
fun resetQueue(){
transitionQueue.clear()
}
fun enqueue(color: HCL){
if (currentTo == null){
currentTo = color
}
else{
transitionQueue.add(color)
}
}
fun updateGetColor(): HCL{
val currentTime = MC.systemTime
val elapsedTime = currentTime - lastUpdateTime
lastUpdateTime = currentTime
val transitionTo = currentTo
if (transitionTo == null){
return currentFrom
}
currentProgress += elapsedTime / transitionDuration
if (currentProgress >= 1F){
currentProgress = 0F
currentFrom = transitionTo
currentTo = if (transitionQueue.isEmpty()) null else transitionQueue.removeAt(0)
return currentFrom
}
else{
val hueSource = if (transitionTo.chroma > 0F && currentFrom.chroma == 0F) transitionTo else currentFrom
return HCL(
hue = hueSource.hue,
chroma = currentFrom.chroma + (transitionTo.chroma - currentFrom.chroma) * currentProgress,
luminance = currentFrom.luminance + (transitionTo.luminance - currentFrom.luminance) * currentProgress
)
}
}
}
@@ -0,0 +1,136 @@
package chylex.hee.client.render.util
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.GlStateManager
import net.minecraft.client.renderer.GlStateManager.DestFactor
import net.minecraft.client.renderer.GlStateManager.FogMode
import net.minecraft.client.renderer.GlStateManager.SourceFactor
import net.minecraft.client.renderer.GlStateManager.TexGen
import java.nio.FloatBuffer
typealias GLSM = GlStateManager
@Sided(Side.CLIENT)
object GL{
// General
fun depthMask(enable: Boolean) = GLSM.depthMask(enable)
fun enableCull() = GLSM.enableCull()
fun disableCull() = GLSM.disableCull()
fun enableRescaleNormal() = GLSM.enableRescaleNormal()
fun disableRescaleNormal() = GLSM.disableRescaleNormal()
// Blend
fun enableBlend() = GLSM.enableBlend()
fun disableBlend() = GLSM.disableBlend()
fun blendFunc(s: SourceFactor, d: DestFactor) = GLSM.blendFunc(s, d)
fun blendFunc(srgb: SourceFactor, drgb: DestFactor, sa: SourceFactor, da: DestFactor) = GLSM.tryBlendFuncSeparate(srgb, drgb, sa, da)
// Alpha
fun enableAlpha() = GLSM.enableAlpha()
fun disableAlpha() = GLSM.disableAlpha()
fun alphaFunc(func: Int, ref: Float) = GLSM.alphaFunc(func, ref)
// Fog
fun enableFog() = GLSM.enableFog()
fun disableFog() = GLSM.disableFog()
fun setFogMode(mode: FogMode) = GLSM.setFog(mode)
fun setFogDensity(density: Float) = GLSM.setFogDensity(density)
// Lighting
fun enableLighting() = GLSM.enableLighting()
fun disableLighting() = GLSM.disableLighting()
fun shadeModel(model: Int) = GLSM.shadeModel(model)
// Color
fun enableColorMaterial() = GLSM.enableColorMaterial()
fun disableColorMaterial() = GLSM.disableColorMaterial()
fun color(red: Float, green: Float, blue: Float) = GLSM.color(red, green, blue)
fun color(red: Float, green: Float, blue: Float, alpha: Float) = GLSM.color(red, green, blue, alpha)
// Texture
fun enableTexture2D() = GLSM.enableTexture2D()
fun disableTexture2D() = GLSM.disableTexture2D()
fun enableOutlineMode(color: Int) = GLSM.enableOutlineMode(color)
fun disableOutlineMode() = GLSM.disableOutlineMode()
fun enableTexGenCoord(tex: TexGen) = GLSM.enableTexGenCoord(tex)
fun disableTexGenCoord(tex: TexGen) = GLSM.disableTexGenCoord(tex)
fun texGenMode(tex: TexGen, mode: Int) = GLSM.texGen(tex, mode)
fun texGenParam(tex: TexGen, param: Int, buffer: FloatBuffer) = GLSM.texGen(tex, param, buffer)
// Matrix
fun loadIdentity() = GLSM.loadIdentity()
fun pushMatrix() = GLSM.pushMatrix()
fun popMatrix() = GLSM.popMatrix()
fun matrixMode(mode: Int) = GLSM.matrixMode(mode)
fun translate(x: Float, y: Float, z: Float) = GLSM.translate(x, y, z)
fun translate(x: Double, y: Double, z: Double) = GLSM.translate(x, y, z)
fun scale(x: Float, y: Float, z: Float) = GLSM.scale(x, y, z)
fun scale(x: Double, y: Double, z: Double) = GLSM.scale(x, y, z)
fun rotate(angle: Float, x: Float, y: Float, z: Float) = GLSM.rotate(angle, x, y, z)
// fun rotate(angle: Double, x: Double, y: Double, z: Double) = GLSM.rotate(angle, x, y, z)
// Constants
val TEX_S = TexGen.S
val TEX_T = TexGen.T
val TEX_R = TexGen.R
val TEX_Q = TexGen.Q
val SF_CONSTANT_ALPHA = SourceFactor.CONSTANT_ALPHA
val SF_CONSTANT_COLOR = SourceFactor.CONSTANT_COLOR
val SF_DST_ALPHA = SourceFactor.DST_ALPHA
val SF_DST_COLOR = SourceFactor.DST_COLOR
val SF_ONE = SourceFactor.ONE
val SF_ONE_MINUS_CONSTANT_ALPHA = SourceFactor.ONE_MINUS_CONSTANT_ALPHA
val SF_ONE_MINUS_CONSTANT_COLOR = SourceFactor.ONE_MINUS_CONSTANT_COLOR
val SF_ONE_MINUS_DST_ALPHA = SourceFactor.ONE_MINUS_DST_ALPHA
val SF_ONE_MINUS_DST_COLOR = SourceFactor.ONE_MINUS_DST_COLOR
val SF_ONE_MINUS_SRC_ALPHA = SourceFactor.ONE_MINUS_SRC_ALPHA
val SF_ONE_MINUS_SRC_COLOR = SourceFactor.ONE_MINUS_SRC_COLOR
val SF_SRC_ALPHA = SourceFactor.SRC_ALPHA
val SF_SRC_ALPHA_SATURATE = SourceFactor.SRC_ALPHA_SATURATE
val SF_SRC_COLOR = SourceFactor.SRC_COLOR
val SF_ZERO = SourceFactor.ZERO
val DF_CONSTANT_ALPHA = DestFactor.CONSTANT_ALPHA
val DF_CONSTANT_COLOR = DestFactor.CONSTANT_COLOR
val DF_DST_ALPHA = DestFactor.DST_ALPHA
val DF_DST_COLOR = DestFactor.DST_COLOR
val DF_ONE = DestFactor.ONE
val DF_ONE_MINUS_CONSTANT_ALPHA = DestFactor.ONE_MINUS_CONSTANT_ALPHA
val DF_ONE_MINUS_CONSTANT_COLOR = DestFactor.ONE_MINUS_CONSTANT_COLOR
val DF_ONE_MINUS_DST_ALPHA = DestFactor.ONE_MINUS_DST_ALPHA
val DF_ONE_MINUS_DST_COLOR = DestFactor.ONE_MINUS_DST_COLOR
val DF_ONE_MINUS_SRC_ALPHA = DestFactor.ONE_MINUS_SRC_ALPHA
val DF_ONE_MINUS_SRC_COLOR = DestFactor.ONE_MINUS_SRC_COLOR
val DF_SRC_ALPHA = DestFactor.SRC_ALPHA
val DF_SRC_COLOR = DestFactor.SRC_COLOR
val DF_ZERO = DestFactor.ZERO
val FOG_LINEAR = FogMode.LINEAR
val FOG_EXP = FogMode.EXP
val FOG_EXP2 = FogMode.EXP2
}
@@ -0,0 +1,45 @@
package chylex.hee.client.render.util
import chylex.hee.client.render.util.GL.DF_ONE_MINUS_SRC_ALPHA
import chylex.hee.client.render.util.GL.DF_ZERO
import chylex.hee.client.render.util.GL.SF_ONE
import chylex.hee.client.render.util.GL.SF_SRC_ALPHA
import chylex.hee.client.util.MC
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.renderer.RenderHelper
import net.minecraft.client.renderer.block.model.IBakedModel
import net.minecraft.client.renderer.texture.ITextureObject
import net.minecraft.client.renderer.texture.TextureMap
import net.minecraft.item.ItemStack
import net.minecraft.util.ResourceLocation
import org.lwjgl.opengl.GL11.GL_GREATER
@Sided(Side.CLIENT)
object ItemRenderHelper{
val TEX_BLOCKS_ITEMS: ResourceLocation = TextureMap.LOCATION_BLOCKS_TEXTURE
private lateinit var texBlocksItemsObj: ITextureObject
fun beginItemModel(){
with(MC.textureManager){
texBlocksItemsObj = getTexture(TEX_BLOCKS_ITEMS).also { it.setBlurMipmap(false, false) }
bindTexture(TEX_BLOCKS_ITEMS)
}
RenderHelper.enableStandardItemLighting()
GL.alphaFunc(GL_GREATER, 0.1F)
GL.enableRescaleNormal()
GL.enableBlend()
GL.blendFunc(SF_SRC_ALPHA, DF_ONE_MINUS_SRC_ALPHA, SF_ONE, DF_ZERO)
}
fun getItemModel(stack: ItemStack): IBakedModel{
return MC.itemRenderer.getItemModelWithOverrides(stack, MC.world, null)
}
fun endItemModel(){
GL.disableBlend()
GL.disableRescaleNormal()
texBlocksItemsObj.restoreLastBlurMipmap()
}
}
@@ -0,0 +1,55 @@
package chylex.hee.client.render.util
import net.minecraft.client.model.ModelBox
import net.minecraft.client.model.ModelRenderer
class ModelBoxBuilder(private val model: ModelRenderer){
private var x = 0F
private var y = 0F
private var z = 0F
private var w = 0
private var h = 0
private var d = 0
private var u: Int? = null
private var v: Int? = null
private var mirror = false
fun offset(x: Float, y: Float, z: Float): ModelBoxBuilder{
this.x = x
this.y = y
this.z = z
return this
}
fun size(w: Int, h: Int, d: Int): ModelBoxBuilder{
this.w = w
this.h = h
this.d = d
return this
}
fun tex(u: Int, v: Int): ModelBoxBuilder{
this.u = u
this.v = v
return this
}
fun mirror(): ModelBoxBuilder{
this.mirror = true
return this
}
fun add(){
val u = u
val v = v
if (u == null || v == null){
model.addBox(x, y, z, w, h, d, mirror)
}
else{
model.cubeList.add(ModelBox(model, u, v, x, y, z, w, h, d, 0F, mirror))
}
}
}
@@ -0,0 +1,9 @@
package chylex.hee.client.render.util
import net.minecraft.client.model.ModelRenderer
val ModelRenderer.beginBox
get() = ModelBoxBuilder(this)
fun ModelRenderer.render(){
this.render(1F / 16F)
}
@@ -0,0 +1,12 @@
package chylex.hee.client.render.util
import net.minecraft.client.renderer.BufferBuilder
import net.minecraft.client.renderer.Tessellator
import net.minecraft.client.renderer.vertex.VertexFormat
val TESSELLATOR: Tessellator = Tessellator.getInstance()
inline fun Tessellator.draw(mode: Int, format: VertexFormat, procedure: BufferBuilder.() -> Unit){
this.buffer.begin(mode, format)
this.buffer.apply(procedure)
this.draw()
}
@@ -0,0 +1,26 @@
package chylex.hee.client.sound
import chylex.hee.game.entity.projectile.EntityProjectileSpatialDash
import chylex.hee.system.migration.vanilla.Sounds
import chylex.hee.system.util.nextFloat
import net.minecraft.client.audio.MovingSound
import net.minecraft.util.SoundCategory
class MovingSoundSpatialDash(private val entity: EntityProjectileSpatialDash) : MovingSound(Sounds.ITEM_ELYTRA_FLYING, SoundCategory.PLAYERS){
init{
volume = 0.9F
pitch = entity.world.rand.nextFloat(1.1F, 1.4F)
repeat = true
repeatDelay = 0
}
override fun update(){
if (entity.isDead){
donePlaying = true
return
}
xPosF = entity.posX.toFloat()
yPosF = entity.posY.toFloat()
zPosF = entity.posZ.toFloat()
}
}
@@ -0,0 +1,66 @@
package chylex.hee.client.util
import chylex.hee.system.migration.forge.Side
import chylex.hee.system.migration.forge.Sided
import net.minecraft.client.Minecraft
import net.minecraft.client.entity.EntityPlayerSP
import net.minecraft.client.gui.FontRenderer
import net.minecraft.client.gui.GuiScreen
import net.minecraft.client.gui.ScaledResolution
import net.minecraft.client.multiplayer.WorldClient
import net.minecraft.client.particle.ParticleManager
import net.minecraft.client.renderer.EntityRenderer
import net.minecraft.client.renderer.RenderItem
import net.minecraft.client.renderer.entity.RenderManager
import net.minecraft.client.renderer.texture.TextureManager
import net.minecraft.client.settings.GameSettings
@Sided(Side.CLIENT)
object MC{
@JvmField
val instance: Minecraft = Minecraft.getMinecraft()
// General
val settings: GameSettings
get() = instance.gameSettings
val resolution
get() = ScaledResolution(instance)
val systemTime
get() = Minecraft.getSystemTime()
// Game state
val player: EntityPlayerSP?
get() = instance.player
val world: WorldClient?
get() = instance.world
val currentScreen: GuiScreen?
get() = instance.currentScreen
// Rendering
val partialTicks: Float
get() = instance.renderPartialTicks
val textureManager: TextureManager
get() = instance.textureManager
val renderManager: RenderManager
get() = instance.renderManager
val particleManager: ParticleManager
get() = instance.effectRenderer
val entityRenderer: EntityRenderer
get() = instance.entityRenderer
val itemRenderer: RenderItem
get() = instance.renderItem
val fontRenderer: FontRenderer
get() = instance.fontRenderer
}

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