@hytopia.com/examples 1.0.27 → 1.0.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/frontiers-rpg-game/assets/avatars/bookshelf.png +0 -0
- package/frontiers-rpg-game/assets/avatars/gravekeeper.png +0 -0
- package/frontiers-rpg-game/assets/avatars/herder.png +0 -0
- package/frontiers-rpg-game/assets/blocks/bricks.png +0 -0
- package/frontiers-rpg-game/assets/blocks/clay.png +0 -0
- package/frontiers-rpg-game/assets/blocks/coal-ore.png +0 -0
- package/frontiers-rpg-game/assets/blocks/cobblestone-mossy.png +0 -0
- package/frontiers-rpg-game/assets/blocks/cobblestone.png +0 -0
- package/frontiers-rpg-game/assets/blocks/creep.png +0 -0
- package/frontiers-rpg-game/assets/blocks/diamond-ore.png +0 -0
- package/frontiers-rpg-game/assets/blocks/emerald-block.png +0 -0
- package/frontiers-rpg-game/assets/blocks/emerald-ore.png +0 -0
- package/frontiers-rpg-game/assets/blocks/glass.png +0 -0
- package/frontiers-rpg-game/assets/blocks/gold-ore.png +0 -0
- package/frontiers-rpg-game/assets/blocks/green_fungus/+x.png +0 -0
- package/frontiers-rpg-game/assets/blocks/green_fungus/+y.png +0 -0
- package/frontiers-rpg-game/assets/blocks/green_fungus/+z.png +0 -0
- package/frontiers-rpg-game/assets/blocks/green_fungus/-x.png +0 -0
- package/frontiers-rpg-game/assets/blocks/green_fungus/-y.png +0 -0
- package/frontiers-rpg-game/assets/blocks/green_fungus/-z.png +0 -0
- package/frontiers-rpg-game/assets/blocks/log/+x.png +0 -0
- package/frontiers-rpg-game/assets/blocks/log/+y.png +0 -0
- package/frontiers-rpg-game/assets/blocks/log/+z.png +0 -0
- package/frontiers-rpg-game/assets/blocks/log/-x.png +0 -0
- package/frontiers-rpg-game/assets/blocks/log/-y.png +0 -0
- package/frontiers-rpg-game/assets/blocks/log/-z.png +0 -0
- package/frontiers-rpg-game/assets/blocks/mossy_dirt/+x.png +0 -0
- package/frontiers-rpg-game/assets/blocks/mossy_dirt/+y.png +0 -0
- package/frontiers-rpg-game/assets/blocks/mossy_dirt/+z.png +0 -0
- package/frontiers-rpg-game/assets/blocks/mossy_dirt/-x.png +0 -0
- package/frontiers-rpg-game/assets/blocks/mossy_dirt/-y.png +0 -0
- package/frontiers-rpg-game/assets/blocks/mossy_dirt/-z.png +0 -0
- package/frontiers-rpg-game/assets/blocks/murky-water.png +0 -0
- package/frontiers-rpg-game/assets/blocks/mushroom_top/+x.png +0 -0
- package/frontiers-rpg-game/assets/blocks/mushroom_top/+y.png +0 -0
- package/frontiers-rpg-game/assets/blocks/mushroom_top/+z.png +0 -0
- package/frontiers-rpg-game/assets/blocks/mushroom_top/-x.png +0 -0
- package/frontiers-rpg-game/assets/blocks/mushroom_top/-y.png +0 -0
- package/frontiers-rpg-game/assets/blocks/mushroom_top/-z.png +0 -0
- package/frontiers-rpg-game/assets/blocks/oak-planks-leafy.png +0 -0
- package/frontiers-rpg-game/assets/blocks/oak-planks-leafyer.png +0 -0
- package/frontiers-rpg-game/assets/blocks/oak-planks-leafyerer.png +0 -0
- package/frontiers-rpg-game/assets/blocks/sand.png +0 -0
- package/frontiers-rpg-game/assets/blocks/sandstone.png +0 -0
- package/frontiers-rpg-game/assets/blocks/shadowrock.png +0 -0
- package/frontiers-rpg-game/assets/blocks/snow-rough.png +0 -0
- package/frontiers-rpg-game/assets/blocks/snow.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/brittle-nails.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/chieftan-blade.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/gold-ingot.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/gorkin-ear.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/gorkin-eye.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/gorkin-foot.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/gorkin-hand.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/gorkin-skull.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/healing-potion.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/iron-chestplate.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/iron-gauntlets.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/iron-grieves.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/iron-helmet.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/iron-ingot.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/iron-leggings.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/shackle.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/shattered-sword.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/silver-slab.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/tough-monster-hide.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/weaver-carapace.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/weaver-egg.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/weaver-heart.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/weaver-silk.png +0 -0
- package/frontiers-rpg-game/assets/icons/items/woolran-scroll.png +0 -0
- package/frontiers-rpg-game/assets/maps/chitter-forest.json +5193 -5203
- package/frontiers-rpg-game/assets/maps/hearthwilds.json +21381 -2612
- package/frontiers-rpg-game/assets/models/enemies/.optimized/angler/angler-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/angler/angler-named-nodes.gltf +5472 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/angler/angler.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/angler/angler.gltf +4122 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/angler/angler.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/angler/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/blight-knight-ceres/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/blight-knight-ceres/blight-knight-ceres-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/blight-knight-ceres/blight-knight-ceres-named-nodes.gltf +17967 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/blight-knight-ceres/blight-knight-ceres.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/blight-knight-ceres/blight-knight-ceres.gltf +17403 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/blight-knight-ceres/blight-knight-ceres.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/blighted-capfolk/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/blighted-capfolk/blighted-capfolk-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/blighted-capfolk/blighted-capfolk-named-nodes.gltf +1658 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/blighted-capfolk/blighted-capfolk.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/blighted-capfolk/blighted-capfolk.gltf +1658 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/blighted-capfolk/blighted-capfolk.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/capfolk-guardian/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/capfolk-guardian/capfolk-guardian-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/capfolk-guardian/capfolk-guardian-named-nodes.gltf +9410 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/capfolk-guardian/capfolk-guardian.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/capfolk-guardian/capfolk-guardian.gltf +4261 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/capfolk-guardian/capfolk-guardian.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/baseColor_1.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/baseColor_2.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/gorkin-archer-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/gorkin-archer-named-nodes.gltf +6093 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/gorkin-archer.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/gorkin-archer.gltf +4430 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/gorkin-archer.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/baseColor_1.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/baseColor_2.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/gorkin-assassin-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/gorkin-assassin-named-nodes.gltf +5441 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/gorkin-assassin.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/gorkin-assassin.gltf +4084 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/gorkin-assassin.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-blademaster/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-blademaster/gorkin-blademaster-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-blademaster/gorkin-blademaster-named-nodes.gltf +5302 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-blademaster/gorkin-blademaster.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-blademaster/gorkin-blademaster.gltf +4134 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-blademaster/gorkin-blademaster.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-chieftan/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-chieftan/gorkin-chieftan-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-chieftan/gorkin-chieftan-named-nodes.gltf +7052 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-chieftan/gorkin-chieftan.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-chieftan/gorkin-chieftan.gltf +5581 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-chieftan/gorkin-chieftan.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-enforcer/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-enforcer/gorkin-enforcer-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-enforcer/gorkin-enforcer-named-nodes.gltf +4086 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-enforcer/gorkin-enforcer.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-enforcer/gorkin-enforcer.gltf +3472 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-enforcer/gorkin-enforcer.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-grunt/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-grunt/gorkin-grunt-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-grunt/gorkin-grunt-named-nodes.gltf +3698 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-grunt/gorkin-grunt.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-grunt/gorkin-grunt.gltf +3193 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-grunt/gorkin-grunt.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-hunter/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-hunter/gorkin-hunter-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-hunter/gorkin-hunter-named-nodes.gltf +3985 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-hunter/gorkin-hunter.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-hunter/gorkin-hunter.gltf +3092 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-hunter/gorkin-hunter.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-shaman/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-shaman/gorkin-shaman-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-shaman/gorkin-shaman-named-nodes.gltf +3850 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-shaman/gorkin-shaman.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-shaman/gorkin-shaman.gltf +3100 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-shaman/gorkin-shaman.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-swordsman/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-swordsman/gorkin-swordsman-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-swordsman/gorkin-swordsman-named-nodes.gltf +4087 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-swordsman/gorkin-swordsman.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-swordsman/gorkin-swordsman.gltf +3582 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-swordsman/gorkin-swordsman.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/mother-viper/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/mother-viper/mother-viper-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/mother-viper/mother-viper-named-nodes.gltf +4212 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/mother-viper/mother-viper.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/mother-viper/mother-viper.gltf +3993 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/mother-viper/mother-viper.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/reclusive-weaver/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/reclusive-weaver/reclusive-weaver-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/reclusive-weaver/reclusive-weaver-named-nodes.gltf +7978 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/reclusive-weaver/reclusive-weaver.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/reclusive-weaver/reclusive-weaver.gltf +7978 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/reclusive-weaver/reclusive-weaver.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/sickly-capfolk/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/sickly-capfolk/sickly-capfolk-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/sickly-capfolk/sickly-capfolk-named-nodes.gltf +1708 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/sickly-capfolk/sickly-capfolk.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/sickly-capfolk/sickly-capfolk.gltf +1667 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/sickly-capfolk/sickly-capfolk.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/snapjaw/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/snapjaw/snapjaw-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/snapjaw/snapjaw-named-nodes.gltf +12107 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/snapjaw/snapjaw.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/snapjaw/snapjaw.gltf +9663 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/snapjaw/snapjaw.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/toxic-frog/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/toxic-frog/toxic-frog-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/toxic-frog/toxic-frog-named-nodes.gltf +5550 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/toxic-frog/toxic-frog.bin +0 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/toxic-frog/toxic-frog.gltf +5550 -0
- package/frontiers-rpg-game/assets/models/enemies/.optimized/toxic-frog/toxic-frog.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/enemies/angler.gltf +1 -0
- package/frontiers-rpg-game/assets/models/enemies/blight-knight-ceres.gltf +1 -0
- package/frontiers-rpg-game/assets/models/enemies/blighted-capfolk.gltf +1 -0
- package/frontiers-rpg-game/assets/models/enemies/capfolk-guardian.gltf +1 -0
- package/frontiers-rpg-game/assets/models/enemies/gorkin-chieftan.gltf +1 -0
- package/frontiers-rpg-game/assets/models/enemies/gorkin-enforcer.gltf +1 -0
- package/frontiers-rpg-game/assets/models/enemies/gorkin-grunt.gltf +1 -0
- package/frontiers-rpg-game/assets/models/enemies/gorkin-hunter.gltf +1 -0
- package/frontiers-rpg-game/assets/models/enemies/gorkin-shaman.gltf +1 -0
- package/frontiers-rpg-game/assets/models/enemies/gorkin-swordsman.gltf +1 -0
- package/frontiers-rpg-game/assets/models/enemies/reclusive-weaver.gltf +1 -0
- package/frontiers-rpg-game/assets/models/enemies/sickly-capfolk.gltf +1 -0
- package/frontiers-rpg-game/assets/models/enemies/snapjaw.gltf +1 -0
- package/frontiers-rpg-game/assets/models/enemies/toxic-frog.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/banner-hytopia-1/banner-hytopia-1-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/banner-hytopia-1/banner-hytopia-1-named-nodes.gltf +260 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/banner-hytopia-1/banner-hytopia-1.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/banner-hytopia-1/banner-hytopia-1.gltf +136 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/banner-hytopia-1/banner-hytopia-1.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/banner-hytopia-1/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/bookshelf/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/bookshelf/bookshelf-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/bookshelf/bookshelf-named-nodes.gltf +882 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/bookshelf/bookshelf.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/bookshelf/bookshelf.gltf +136 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/bookshelf/bookshelf.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/training-dummy/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/training-dummy/training-dummy-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/training-dummy/training-dummy-named-nodes.gltf +1312 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/training-dummy/training-dummy.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/training-dummy/training-dummy.gltf +1006 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/training-dummy/training-dummy.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/baseColor_1.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/baseColor_2.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/baseColor_3.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/baseColor_4.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/weapon-rack-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/weapon-rack-named-nodes.gltf +909 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/weapon-rack.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/weapon-rack.gltf +418 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/weapon-rack.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/banner-hytopia-1.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/bookshelf.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/training-dummy.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/weapon-rack.gltf +1 -0
- package/frontiers-rpg-game/assets/models/forageables/.optimized/abandoned-crate/abandoned-crate-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/forageables/.optimized/abandoned-crate/abandoned-crate-named-nodes.gltf +724 -0
- package/frontiers-rpg-game/assets/models/forageables/.optimized/abandoned-crate/abandoned-crate.bin +0 -0
- package/frontiers-rpg-game/assets/models/forageables/.optimized/abandoned-crate/abandoned-crate.gltf +131 -0
- package/frontiers-rpg-game/assets/models/forageables/.optimized/abandoned-crate/abandoned-crate.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/forageables/.optimized/abandoned-crate/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/forageables/.optimized/weathered-stump/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/forageables/.optimized/weathered-stump/weathered-stump-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/forageables/.optimized/weathered-stump/weathered-stump-named-nodes.gltf +521 -0
- package/frontiers-rpg-game/assets/models/forageables/.optimized/weathered-stump/weathered-stump.bin +0 -0
- package/frontiers-rpg-game/assets/models/forageables/.optimized/weathered-stump/weathered-stump.gltf +136 -0
- package/frontiers-rpg-game/assets/models/forageables/.optimized/weathered-stump/weathered-stump.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/forageables/abandoned-crate.gltf +1 -0
- package/frontiers-rpg-game/assets/models/forageables/weathered-stump.gltf +1 -0
- package/frontiers-rpg-game/assets/models/mounts/.optimized/woolran/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/mounts/.optimized/woolran/woolran-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/mounts/.optimized/woolran/woolran-named-nodes.gltf +6889 -0
- package/frontiers-rpg-game/assets/models/mounts/.optimized/woolran/woolran.bin +0 -0
- package/frontiers-rpg-game/assets/models/mounts/.optimized/woolran/woolran.gltf +4486 -0
- package/frontiers-rpg-game/assets/models/mounts/.optimized/woolran/woolran.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/mounts/woolran.gltf +1 -0
- package/frontiers-rpg-game/assets/models/npcs/.optimized/gravekeeper/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/npcs/.optimized/gravekeeper/gravekeeper-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/npcs/.optimized/gravekeeper/gravekeeper-named-nodes.gltf +3049 -0
- package/frontiers-rpg-game/assets/models/npcs/.optimized/gravekeeper/gravekeeper.bin +0 -0
- package/frontiers-rpg-game/assets/models/npcs/.optimized/gravekeeper/gravekeeper.gltf +1647 -0
- package/frontiers-rpg-game/assets/models/npcs/.optimized/gravekeeper/gravekeeper.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/npcs/.optimized/herder/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/npcs/.optimized/herder/herder-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/npcs/.optimized/herder/herder-named-nodes.gltf +3259 -0
- package/frontiers-rpg-game/assets/models/npcs/.optimized/herder/herder.bin +0 -0
- package/frontiers-rpg-game/assets/models/npcs/.optimized/herder/herder.gltf +1615 -0
- package/frontiers-rpg-game/assets/models/npcs/.optimized/herder/herder.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/players/.optimized/player/player-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/players/.optimized/player/player-named-nodes.gltf +7802 -6249
- package/frontiers-rpg-game/assets/models/players/.optimized/player/player.bin +0 -0
- package/frontiers-rpg-game/assets/models/players/.optimized/player/player.gltf +7046 -5480
- package/frontiers-rpg-game/assets/models/players/.optimized/player/player.gltf.md5 +1 -1
- package/frontiers-rpg-game/assets/models/players/player.gltf +1 -1
- package/frontiers-rpg-game/assets/models/weapons/.optimized/chieftan-blade/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/weapons/.optimized/chieftan-blade/chieftan-blade-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/weapons/.optimized/chieftan-blade/chieftan-blade-named-nodes.gltf +726 -0
- package/frontiers-rpg-game/assets/models/weapons/.optimized/chieftan-blade/chieftan-blade.bin +0 -0
- package/frontiers-rpg-game/assets/models/weapons/.optimized/chieftan-blade/chieftan-blade.gltf +335 -0
- package/frontiers-rpg-game/assets/models/weapons/.optimized/chieftan-blade/chieftan-blade.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/weapons/chieftan-blade.gltf +1 -0
- package/frontiers-rpg-game/assets/particles/dirt.png +0 -0
- package/frontiers-rpg-game/assets/ui/index.html +50 -7
- package/frontiers-rpg-game/assets/ui/menus/dialogue.html +30 -4
- package/frontiers-rpg-game/assets/ui/shared/item-stats.html +1 -1
- package/frontiers-rpg-game/assets/ui/shared/item-tooltips.html +19 -2
- package/frontiers-rpg-game/src/GameClock.ts +14 -0
- package/frontiers-rpg-game/src/GameManager.ts +1 -4
- package/frontiers-rpg-game/src/GameRegion.ts +6 -2
- package/frontiers-rpg-game/src/entities/BaseCombatEntity.ts +58 -26
- package/frontiers-rpg-game/src/entities/BaseEntity.ts +10 -3
- package/frontiers-rpg-game/src/entities/enemies/GorkinChieftanEntity.ts +190 -0
- package/frontiers-rpg-game/src/entities/enemies/GorkinEnforcerEntity.ts +87 -0
- package/frontiers-rpg-game/src/entities/enemies/GorkinGruntEntity.ts +113 -0
- package/frontiers-rpg-game/src/entities/enemies/GorkinHunterEntity.ts +90 -0
- package/frontiers-rpg-game/src/entities/enemies/GorkinShamanEntity.ts +154 -0
- package/frontiers-rpg-game/src/entities/enemies/GorkinSwordsmanEntity.ts +121 -0
- package/frontiers-rpg-game/src/entities/enemies/QueenWeaverEntity.ts +8 -0
- package/frontiers-rpg-game/src/entities/enemies/RatkinBruteEntity.ts +14 -0
- package/frontiers-rpg-game/src/entities/enemies/RatkinRangerEntity.ts +8 -0
- package/frontiers-rpg-game/src/entities/enemies/RatkinSpellcasterEntity.ts +8 -0
- package/frontiers-rpg-game/src/entities/enemies/RatkinWarriorEntity.ts +12 -0
- package/frontiers-rpg-game/src/entities/enemies/ReclusiveWeaverEntity.ts +119 -0
- package/frontiers-rpg-game/src/entities/{environmental → enemies}/SpiderWebEntity.ts +14 -8
- package/frontiers-rpg-game/src/entities/enemies/TaintedRatkinBruteEntity.ts +6 -0
- package/frontiers-rpg-game/src/entities/enemies/TaintedRatkinWarriorEntity.ts +4 -0
- package/frontiers-rpg-game/src/entities/enemies/WeaverBroodlingEntity.ts +5 -1
- package/frontiers-rpg-game/src/entities/forageables/AbandonedCrateEntity.ts +57 -0
- package/frontiers-rpg-game/src/entities/forageables/WeatheredStumpEntity.ts +37 -0
- package/frontiers-rpg-game/src/entities/npcs/WoolranEntity.ts +26 -0
- package/frontiers-rpg-game/src/items/ItemClasses.ts +45 -1
- package/frontiers-rpg-game/src/items/ItemUIDataHelper.ts +3 -1
- package/frontiers-rpg-game/src/items/consumables/HealingPotionItem.ts +20 -0
- package/frontiers-rpg-game/src/items/materials/GoldIngotItem.ts +11 -0
- package/frontiers-rpg-game/src/items/materials/GorkinEarItem.ts +10 -0
- package/frontiers-rpg-game/src/items/materials/GorkinEyeItem.ts +10 -0
- package/frontiers-rpg-game/src/items/materials/GorkinFootItem.ts +10 -0
- package/frontiers-rpg-game/src/items/materials/GorkinHandItem.ts +10 -0
- package/frontiers-rpg-game/src/items/materials/GorkinSkullItem.ts +10 -0
- package/frontiers-rpg-game/src/items/materials/IronIngotItem.ts +11 -0
- package/frontiers-rpg-game/src/items/materials/ShackleItem.ts +10 -0
- package/frontiers-rpg-game/src/items/materials/ShatteredSwordItem.ts +10 -0
- package/frontiers-rpg-game/src/items/materials/SilverSlabItem.ts +11 -0
- package/frontiers-rpg-game/src/items/materials/ToughMonsterHide.ts +10 -0
- package/frontiers-rpg-game/src/items/materials/WeaverCarapaceItem.ts +11 -0
- package/frontiers-rpg-game/src/items/materials/WeaverEggItem.ts +11 -0
- package/frontiers-rpg-game/src/items/materials/WeaverHeartItem.ts +10 -0
- package/frontiers-rpg-game/src/items/materials/WeaverSilkItem.ts +10 -0
- package/frontiers-rpg-game/src/items/weapons/ChieftanBladeItem.ts +70 -0
- package/frontiers-rpg-game/src/items/wearables/IronChestplateItem.ts +15 -0
- package/frontiers-rpg-game/src/items/wearables/IronGauntletsItem.ts +14 -0
- package/frontiers-rpg-game/src/items/wearables/IronGrievesItem.ts +14 -0
- package/frontiers-rpg-game/src/items/wearables/IronHelmetItem.ts +15 -0
- package/frontiers-rpg-game/src/items/wearables/IronLeggingsItem.ts +15 -0
- package/frontiers-rpg-game/src/quests/QuestClasses.ts +6 -0
- package/frontiers-rpg-game/src/quests/main/AncientWisdomQuest.ts +125 -0
- package/frontiers-rpg-game/src/quests/main/BlightedHarvestQuest.ts +27 -5
- package/frontiers-rpg-game/src/quests/side/SkullTrinketsQuest.ts +202 -0
- package/frontiers-rpg-game/src/quests/side/WeaverSquashingQuest.ts +128 -0
- package/frontiers-rpg-game/src/regions/chitter-forest/ChitterForestRegion.ts +25 -0
- package/frontiers-rpg-game/src/regions/hearthwilds/HearthwildsRegion.ts +175 -4
- package/frontiers-rpg-game/src/regions/hearthwilds/npcs/ArchivesBookshelf1Entity.ts +136 -0
- package/frontiers-rpg-game/src/regions/hearthwilds/npcs/ArchivesBookshelf2Entity.ts +136 -0
- package/frontiers-rpg-game/src/regions/hearthwilds/npcs/GravekeeperArdenEntity.ts +48 -0
- package/frontiers-rpg-game/src/regions/hearthwilds/npcs/HerderBorisEntity.ts +61 -0
- package/frontiers-rpg-game/src/regions/hearthwilds/npcs/MerchantFonnEntity.ts +62 -0
- package/frontiers-rpg-game/src/regions/hearthwilds/npcs/SurvivorMycelEntity.ts +62 -0
- package/frontiers-rpg-game/src/regions/ratkin-nest/RatkinNestRegion.ts +3 -0
- package/frontiers-rpg-game/src/regions/stalkhaven/npcs/BlacksmithArdenEntity.ts +116 -5
- package/frontiers-rpg-game/src/regions/weavers-hollow/WeaversHollowRegion.ts +1 -1
- package/frontiers-rpg-game/src/systems/Spawner.ts +9 -1
- package/package.json +1 -1
- /package/frontiers-rpg-game/assets/models/npcs/{auctioneer.gltf → gravekeeper.gltf} +0 -0
- /package/frontiers-rpg-game/assets/models/npcs/{lumberjack.gltf → herder.gltf} +0 -0
|
@@ -46,19 +46,16 @@ export default class GameManager {
|
|
|
46
46
|
const chitterForestRegion = new ChitterForestRegion();
|
|
47
47
|
this._regions.set(chitterForestRegion.id, chitterForestRegion);
|
|
48
48
|
GameClock.instance.addRegionClockCycle(chitterForestRegion);
|
|
49
|
-
// this._startRegion = chitterForestRegion;
|
|
50
49
|
|
|
51
50
|
// Hearthwilds
|
|
52
51
|
const hearthwildsRegion = new HearthwildsRegion();
|
|
53
52
|
this._regions.set(hearthwildsRegion.id, hearthwildsRegion);
|
|
54
53
|
GameClock.instance.addRegionClockCycle(hearthwildsRegion);
|
|
55
|
-
this._startRegion = hearthwildsRegion;
|
|
56
54
|
|
|
57
55
|
// Ratkin Nest
|
|
58
56
|
const ratkinNestRegion = new RatkinNestRegion();
|
|
59
57
|
this._regions.set(ratkinNestRegion.id, ratkinNestRegion);
|
|
60
58
|
GameClock.instance.addRegionClockCycle(ratkinNestRegion);
|
|
61
|
-
// this._startRegion = ratkinNestRegion;
|
|
62
59
|
|
|
63
60
|
// Stalkhaven
|
|
64
61
|
const stalkhavenRegion = new StalkhavenRegion();
|
|
@@ -69,7 +66,7 @@ export default class GameManager {
|
|
|
69
66
|
const stalkhavenPortRegion = new StalkhavenPortRegion();
|
|
70
67
|
this._regions.set(stalkhavenPortRegion.id, stalkhavenPortRegion);
|
|
71
68
|
GameClock.instance.addRegionClockCycle(stalkhavenPortRegion);
|
|
72
|
-
|
|
69
|
+
this._startRegion = stalkhavenPortRegion;
|
|
73
70
|
|
|
74
71
|
// Weaver's Hollow
|
|
75
72
|
const weaversHollowRegion = new WeaversHollowRegion();
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
WorldOptions,
|
|
13
13
|
Vector3Like,
|
|
14
14
|
Quaternion,
|
|
15
|
+
RgbColor,
|
|
15
16
|
} from 'hytopia';
|
|
16
17
|
|
|
17
18
|
import GamePlayer from './GamePlayer';
|
|
@@ -52,6 +53,7 @@ export type GameRegionOptions = {
|
|
|
52
53
|
export default class GameRegion {
|
|
53
54
|
private _id: string;
|
|
54
55
|
private _ambientAudio: Audio | undefined;
|
|
56
|
+
private _baseFogColor: RgbColor | undefined;
|
|
55
57
|
private _isSetup: boolean = false;
|
|
56
58
|
private _maxAmbientLightIntensity: number;
|
|
57
59
|
private _maxDirectionalLightIntensity: number;
|
|
@@ -74,6 +76,7 @@ export default class GameRegion {
|
|
|
74
76
|
loop: true,
|
|
75
77
|
}) : undefined;
|
|
76
78
|
|
|
79
|
+
this._baseFogColor = regionOptions.fogColor;
|
|
77
80
|
this._maxAmbientLightIntensity = regionOptions.maxAmbientLightIntensity ?? DEFAULT_MAX_AMBIENT_LIGHT_INTENSITY;
|
|
78
81
|
this._maxDirectionalLightIntensity = regionOptions.maxDirectionalLightIntensity ?? DEFAULT_MAX_DIRECTIONAL_LIGHT_INTENSITY;
|
|
79
82
|
this._minAmbientLightIntensity = regionOptions.minAmbientLightIntensity ?? DEFAULT_MIN_AMBIENT_LIGHT_INTENSITY;
|
|
@@ -81,13 +84,13 @@ export default class GameRegion {
|
|
|
81
84
|
this._respawnOverride = regionOptions.respawnOverride;
|
|
82
85
|
this._spawnFacingAngle = regionOptions.spawnFacingAngle ?? 0;
|
|
83
86
|
this._spawnPoint = regionOptions.spawnPoint ?? { x: 0, y: 10, z: 0 };
|
|
84
|
-
|
|
87
|
+
|
|
85
88
|
this._world = WorldManager.instance.createWorld(regionOptions);
|
|
86
89
|
this._world.stop(); // Keep it in stopped state, when a player joins the world, we'll start it.
|
|
87
90
|
this._world.on(PlayerEvent.JOINED_WORLD, ({ player }) => this.onPlayerJoin(player));
|
|
88
91
|
this._world.on(PlayerEvent.LEFT_WORLD, ({ player }) => this.onPlayerLeave(player));
|
|
89
92
|
this._world.on(PlayerEvent.RECONNECTED_WORLD, ({ player }) => this.onPlayerReconnected(player));
|
|
90
|
-
|
|
93
|
+
|
|
91
94
|
// temp
|
|
92
95
|
// this._world.simulation.enableDebugRendering(true);
|
|
93
96
|
// this._world.simulation.enableDebugRaycasting(true);
|
|
@@ -96,6 +99,7 @@ export default class GameRegion {
|
|
|
96
99
|
}
|
|
97
100
|
|
|
98
101
|
public get id(): string { return this._id; }
|
|
102
|
+
public get baseFogColor(): RgbColor | undefined { return this._baseFogColor; }
|
|
99
103
|
public get maxAmbientLightIntensity(): number { return this._maxAmbientLightIntensity; }
|
|
100
104
|
public get maxDirectionalLightIntensity(): number { return this._maxDirectionalLightIntensity; }
|
|
101
105
|
public get minAmbientLightIntensity(): number { return this._minAmbientLightIntensity; }
|
|
@@ -37,6 +37,8 @@ export type BaseCombatEntityAttack = {
|
|
|
37
37
|
simpleAttackDamageVariance?: number; // Percentage variance (0-1), e.g., 0.2 = ±20% damage
|
|
38
38
|
simpleAttackDamageDelayMs?: number; // When during animation to deal damage (if projectile, delay after hit)
|
|
39
39
|
simpleAttackReach?: number; // Applies damage if target is < reach after delay
|
|
40
|
+
stopAllAnimationForMs?: number;
|
|
41
|
+
stopMovingForDurationMs?: number;
|
|
40
42
|
stopMovingDuringDelay?: boolean;
|
|
41
43
|
weight: number;
|
|
42
44
|
onHit?: (target: BaseEntity | GamePlayerEntity, attacker: BaseCombatEntity) => void;
|
|
@@ -49,6 +51,7 @@ export type BaseCombatEntityOptions = {
|
|
|
49
51
|
aggroSensorForwardOffset?: number;
|
|
50
52
|
aggroTargetTypes?: (typeof BaseEntity | typeof GamePlayerEntity)[];
|
|
51
53
|
attacks?: BaseCombatEntityAttack[];
|
|
54
|
+
diameterOverride?: number;
|
|
52
55
|
health: number;
|
|
53
56
|
outOfCombatRegenDelayMs?: number;
|
|
54
57
|
outOfCombatRegenPerSecondRate?: number; // rate per second as a percent, ie 0.03 is 3% per second
|
|
@@ -97,7 +100,7 @@ export default class BaseCombatEntity extends BaseEntity {
|
|
|
97
100
|
this._aggroSensorForwardOffset = options.aggroSensorForwardOffset ?? 0;
|
|
98
101
|
this._attacks = options.attacks ?? [];
|
|
99
102
|
this._attackTotalWeight = this._attacks.reduce((sum, attack) => sum + attack.weight, 0);
|
|
100
|
-
this._diameterSquared = this.width > this.depth ? this.width ** 2 : this.depth ** 2;
|
|
103
|
+
this._diameterSquared = options.diameterOverride ? options.diameterOverride ** 2 : (this.width > this.depth ? this.width ** 2 : this.depth ** 2);
|
|
101
104
|
this._nextAttack = this._pickRandomAttack();
|
|
102
105
|
this._outOfCombatRegenDelayMs = options.outOfCombatRegenDelayMs ?? COMBAT_REGEN_DEFAULT_DELAY_MS;
|
|
103
106
|
this._outOfCombatRegenPerSecondRate = options.outOfCombatRegenPerSecondRate ?? COMBAT_REGEN_DEFAULT_RATE;
|
|
@@ -121,6 +124,7 @@ export default class BaseCombatEntity extends BaseEntity {
|
|
|
121
124
|
this.on(EntityEvent.TICK, this._onTick);
|
|
122
125
|
}
|
|
123
126
|
|
|
127
|
+
public get attacks(): BaseCombatEntityAttack[] { return this._attacks; }
|
|
124
128
|
public get diameterSquared(): number { return this._diameterSquared; }
|
|
125
129
|
|
|
126
130
|
public attack() {
|
|
@@ -128,38 +132,38 @@ export default class BaseCombatEntity extends BaseEntity {
|
|
|
128
132
|
|
|
129
133
|
const attack = this._nextAttack;
|
|
130
134
|
const target = this._aggroActiveTarget;
|
|
131
|
-
|
|
135
|
+
|
|
136
|
+
if (attack.stopAllAnimationForMs && !this.isDead) {
|
|
137
|
+
const idleAnimations = this.pathfindingController.idleLoopedAnimations;
|
|
138
|
+
const moveAnimations = this.pathfindingController.moveLoopedAnimations;
|
|
139
|
+
|
|
140
|
+
this.pathfindingController.idleLoopedAnimations = [];
|
|
141
|
+
this.pathfindingController.moveLoopedAnimations = [];
|
|
142
|
+
this.stopAllModelAnimations();
|
|
143
|
+
|
|
144
|
+
setTimeout(() => {
|
|
145
|
+
if (this.isDead) return;
|
|
146
|
+
this.pathfindingController.idleLoopedAnimations = idleAnimations;
|
|
147
|
+
this.pathfindingController.moveLoopedAnimations = moveAnimations;
|
|
148
|
+
this.startModelLoopedAnimations(idleAnimations);
|
|
149
|
+
}, attack.stopAllAnimationForMs);
|
|
150
|
+
}
|
|
151
|
+
|
|
132
152
|
this.startModelOneshotAnimations(attack.animations);
|
|
133
153
|
|
|
134
154
|
if (attack.stopMovingDuringDelay) {
|
|
135
155
|
this.stopMoving();
|
|
136
156
|
this._stopMoving = true;
|
|
137
157
|
}
|
|
158
|
+
|
|
159
|
+
if (attack.stopMovingForDurationMs) {
|
|
160
|
+
this.stopMoving();
|
|
161
|
+
this._stopMoving = true;
|
|
162
|
+
setTimeout(() => this._stopMoving = false, attack.stopMovingForDurationMs);
|
|
163
|
+
}
|
|
138
164
|
|
|
139
165
|
if (!attack.complexAttack) { // Simple attack, animation + damage
|
|
140
|
-
setTimeout(() =>
|
|
141
|
-
if (!target || !this._aggroPotentialTargets.has(target) || this.isDead) return;
|
|
142
|
-
|
|
143
|
-
if (!attack.simpleAttackDamage) {
|
|
144
|
-
return ErrorHandler.warning(`BaseCombatEntity.attack(): Simple attack has no simple attack damage!`);
|
|
145
|
-
};
|
|
146
|
-
|
|
147
|
-
const distanceSquared = this.calculateDistanceSquaredToTarget(target);
|
|
148
|
-
const reachSquared = attack.simpleAttackReach ? attack.simpleAttackReach ** 2 : attack.range ** 2;
|
|
149
|
-
|
|
150
|
-
if (distanceSquared <= reachSquared + this._diameterSquared) { // make sure target is in reach still
|
|
151
|
-
if (isDamageable(target)) {
|
|
152
|
-
const damage = this.calculateDamageWithVariance(attack.simpleAttackDamage, attack.simpleAttackDamageVariance);
|
|
153
|
-
target.takeDamage(damage, this);
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
if (attack.onHit) {
|
|
157
|
-
attack.onHit(target, this);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
this._stopMoving = false;
|
|
162
|
-
}, attack.simpleAttackDamageDelayMs ?? 0);
|
|
166
|
+
setTimeout(() => this.processSimpleAttack(target, attack), attack.simpleAttackDamageDelayMs ?? 0);
|
|
163
167
|
} else { // Complex attack, such as projectile, spell, AoE, etc
|
|
164
168
|
setTimeout(() => {
|
|
165
169
|
if (this.isDead || !attack.complexAttack || !this.world) return;
|
|
@@ -169,7 +173,9 @@ export default class BaseCombatEntity extends BaseEntity {
|
|
|
169
173
|
target: target,
|
|
170
174
|
});
|
|
171
175
|
|
|
172
|
-
|
|
176
|
+
if (attack.stopMovingDuringDelay) {
|
|
177
|
+
this._stopMoving = false;
|
|
178
|
+
}
|
|
173
179
|
}, attack.complexAttackDelayMs ?? 0);
|
|
174
180
|
}
|
|
175
181
|
|
|
@@ -248,6 +254,32 @@ export default class BaseCombatEntity extends BaseEntity {
|
|
|
248
254
|
return Math.floor(min + Math.random() * (max - min));
|
|
249
255
|
}
|
|
250
256
|
|
|
257
|
+
protected processSimpleAttack(target: BaseEntity | GamePlayerEntity, attack: BaseCombatEntityAttack) {
|
|
258
|
+
if (!target || !this._aggroPotentialTargets.has(target) || this.isDead) return;
|
|
259
|
+
|
|
260
|
+
if (!attack.simpleAttackDamage) {
|
|
261
|
+
return ErrorHandler.warning(`BaseCombatEntity.attack(): Simple attack has no simple attack damage!`);
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
const distanceSquared = this.calculateDistanceSquaredToTarget(target);
|
|
265
|
+
const reachSquared = attack.simpleAttackReach ? attack.simpleAttackReach ** 2 : attack.range ** 2;
|
|
266
|
+
|
|
267
|
+
if (distanceSquared <= reachSquared + this._diameterSquared) { // make sure target is in reach still
|
|
268
|
+
if (isDamageable(target)) {
|
|
269
|
+
const damage = this.calculateDamageWithVariance(attack.simpleAttackDamage, attack.simpleAttackDamageVariance);
|
|
270
|
+
target.takeDamage(damage, this);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
if (attack.onHit) {
|
|
274
|
+
attack.onHit(target, this);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
if (attack.stopMovingDuringDelay) {
|
|
279
|
+
this._stopMoving = false;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
251
283
|
protected override shouldDeferWander(): boolean {
|
|
252
284
|
return !!this._aggroActiveTarget;
|
|
253
285
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
Entity,
|
|
3
|
-
|
|
3
|
+
ModelEntityOptions,
|
|
4
4
|
MoveOptions,
|
|
5
5
|
PathfindingEntityController,
|
|
6
6
|
PathfindingOptions,
|
|
@@ -80,8 +80,9 @@ export type BaseEntityOptions = {
|
|
|
80
80
|
nameplateType?: BaseEntityNameplateType;
|
|
81
81
|
nameplateViewDistnace?: number;
|
|
82
82
|
pathfindingOptions?: PathfindingOptions;
|
|
83
|
+
rotatesOnInteract?: boolean;
|
|
83
84
|
pushable?: boolean;
|
|
84
|
-
} &
|
|
85
|
+
} & ModelEntityOptions;
|
|
85
86
|
|
|
86
87
|
export type WanderOptions = {
|
|
87
88
|
idleMinMs: number;
|
|
@@ -111,6 +112,7 @@ export default class BaseEntity extends Entity implements IInteractable, IDamage
|
|
|
111
112
|
private _optionMap: Map<number, BaseEntityDialogueOption> = new Map();
|
|
112
113
|
private _pathfindingOptions: PathfindingOptions | undefined;
|
|
113
114
|
private _pushable: boolean;
|
|
115
|
+
private _rotatesOnInteract: boolean;
|
|
114
116
|
private _wanderTimeout: NodeJS.Timeout | undefined;
|
|
115
117
|
|
|
116
118
|
public constructor(options: BaseEntityOptions = {}) {
|
|
@@ -143,6 +145,8 @@ export default class BaseEntity extends Entity implements IInteractable, IDamage
|
|
|
143
145
|
this._nameplateViewDistance = options.nameplateViewDistnace;
|
|
144
146
|
this._pathfindingOptions = options.pathfindingOptions;
|
|
145
147
|
this._pushable = options.pushable ?? false;
|
|
148
|
+
this._rotatesOnInteract = options.rotatesOnInteract ?? true;
|
|
149
|
+
|
|
146
150
|
if (this._dialogueRoot) {
|
|
147
151
|
this._buildDialogueOptionMap();
|
|
148
152
|
}
|
|
@@ -234,7 +238,10 @@ export default class BaseEntity extends Entity implements IInteractable, IDamage
|
|
|
234
238
|
if (this._dialogueRoot) {
|
|
235
239
|
interactor.setCurrentDialogueEntity(this);
|
|
236
240
|
this.showDialogue(interactor, this._dialogueRoot.dialogue);
|
|
237
|
-
|
|
241
|
+
|
|
242
|
+
if (this._rotatesOnInteract) {
|
|
243
|
+
this.faceTowards(interactor.position, 8);
|
|
244
|
+
}
|
|
238
245
|
}
|
|
239
246
|
}
|
|
240
247
|
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
import { Collider, ColliderShape, ParticleEmitter, RigidBodyType } from "hytopia";
|
|
2
|
+
import BaseCombatEntity, { BaseCombatEntityOptions } from "../BaseCombatEntity";
|
|
3
|
+
import GamePlayerEntity from "../../GamePlayerEntity";
|
|
4
|
+
import { isDamageable } from '../../interfaces/IDamageable';
|
|
5
|
+
import type { Vector3Like, QuaternionLike, World } from 'hytopia';
|
|
6
|
+
import type BaseEntity from "../BaseEntity";
|
|
7
|
+
|
|
8
|
+
// Aggro Target Types
|
|
9
|
+
import ReclusiveWeaverEntity from "./ReclusiveWeaverEntity";
|
|
10
|
+
|
|
11
|
+
// Drops
|
|
12
|
+
import GoldItem from "../../items/general/GoldItem";
|
|
13
|
+
import ChieftanBladeItem from "../../items/weapons/ChieftanBladeItem";
|
|
14
|
+
import GoldIngotItem from "../../items/materials/GoldIngotItem";
|
|
15
|
+
import GorkinEarItem from "../../items/materials/GorkinEarItem";
|
|
16
|
+
import GorkinEyeItem from "../../items/materials/GorkinEyeItem";
|
|
17
|
+
import GorkinFootItem from "../../items/materials/GorkinFootItem";
|
|
18
|
+
import GorkinHandItem from "../../items/materials/GorkinHandItem";
|
|
19
|
+
import GorkinSkullItem from "../../items/materials/GorkinSkullItem";
|
|
20
|
+
import IronIngotItem from "../../items/materials/IronIngotItem";
|
|
21
|
+
import ShatteredSwordItem from "../../items/materials/ShatteredSwordItem";
|
|
22
|
+
import ShackleItem from "../../items/materials/ShackleItem";
|
|
23
|
+
import SilverSlabItem from "../../items/materials/SilverSlabItem";
|
|
24
|
+
import ToughMonsterHide from "../../items/materials/ToughMonsterHide";
|
|
25
|
+
|
|
26
|
+
export type GorkinChieftanEntityOptions = {
|
|
27
|
+
|
|
28
|
+
} & Partial<BaseCombatEntityOptions>;
|
|
29
|
+
|
|
30
|
+
export default class GorkinChieftanEntity extends BaseCombatEntity {
|
|
31
|
+
private _stompParticleEmitter: ParticleEmitter;
|
|
32
|
+
|
|
33
|
+
constructor(options?: GorkinChieftanEntityOptions) {
|
|
34
|
+
super({
|
|
35
|
+
aggroRadius: 9,
|
|
36
|
+
aggroSensorForwardOffset: 3,
|
|
37
|
+
aggroTargetTypes: [
|
|
38
|
+
GamePlayerEntity,
|
|
39
|
+
ReclusiveWeaverEntity,
|
|
40
|
+
],
|
|
41
|
+
attacks: [
|
|
42
|
+
{ // Slash, stab attack
|
|
43
|
+
animations: [ 'atk1' ],
|
|
44
|
+
complexAttack: (params) => this._slashStabAttack(params.target),
|
|
45
|
+
complexAttackDelayMs: 700,
|
|
46
|
+
cooldownMs: 3500,
|
|
47
|
+
simpleAttackDamage: 70, // complex attack triggers simple attack processing
|
|
48
|
+
simpleAttackDamageVariance: 0.3,
|
|
49
|
+
stopAllAnimationForMs: 2500,
|
|
50
|
+
stopMovingForDurationMs: 2500,
|
|
51
|
+
range: 3,
|
|
52
|
+
weight: 2,
|
|
53
|
+
},
|
|
54
|
+
{ // Stomp
|
|
55
|
+
animations: [ 'atk2' ],
|
|
56
|
+
complexAttack: () => this._stompAttack(),
|
|
57
|
+
complexAttackDelayMs: 550,
|
|
58
|
+
cooldownMs: 1800,
|
|
59
|
+
range: 4,
|
|
60
|
+
stopAllAnimationForMs: 1400,
|
|
61
|
+
stopMovingForDurationMs: 1400,
|
|
62
|
+
weight: 1,
|
|
63
|
+
},
|
|
64
|
+
{ // Double slash attack
|
|
65
|
+
animations: [ 'atk3' ],
|
|
66
|
+
complexAttack: (params) => this._doubleSlashAttack(params.target),
|
|
67
|
+
complexAttackDelayMs: 850,
|
|
68
|
+
cooldownMs: 3500,
|
|
69
|
+
simpleAttackDamage: 55, // complex attack triggers simple attack processing
|
|
70
|
+
simpleAttackDamageVariance: 0.2,
|
|
71
|
+
stopAllAnimationForMs: 2500,
|
|
72
|
+
stopMovingForDurationMs: 2500,
|
|
73
|
+
range: 4,
|
|
74
|
+
weight: 1,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
combatExperienceReward: 850,
|
|
78
|
+
deathAnimations: [ 'death' ],
|
|
79
|
+
deathDespawnDelayMs: 2400,
|
|
80
|
+
deathItemDrops: [
|
|
81
|
+
{ itemClass: GoldItem, minQuantity: 30, maxQuantity: 45, weight: 20 },
|
|
82
|
+
{ itemClass: GorkinEyeItem, minQuantity: 1, maxQuantity: 2, weight: 15 },
|
|
83
|
+
{ itemClass: GorkinFootItem, minQuantity: 1, maxQuantity: 2, weight: 15 },
|
|
84
|
+
{ itemClass: GorkinHandItem, minQuantity: 1, maxQuantity: 2, weight: 15 },
|
|
85
|
+
{ itemClass: ShatteredSwordItem, weight: 10 },
|
|
86
|
+
{ itemClass: ToughMonsterHide, weight: 10 },
|
|
87
|
+
{ itemClass: GorkinSkullItem, weight: 10 },
|
|
88
|
+
{ itemClass: ShackleItem, weight: 10 },
|
|
89
|
+
{ itemClass: GoldIngotItem, minQuantity: 1, maxQuantity: 2, weight: 5 },
|
|
90
|
+
{ itemClass: IronIngotItem, minQuantity: 1, maxQuantity: 2, weight: 5 },
|
|
91
|
+
{ itemClass: SilverSlabItem, minQuantity: 1, maxQuantity: 2, weight: 5 },
|
|
92
|
+
{ itemClass: GorkinEarItem, minQuantity: 1, maxQuantity: 2, weight: 5 },
|
|
93
|
+
{ itemClass: ChieftanBladeItem, weight: 1 },
|
|
94
|
+
],
|
|
95
|
+
deathItemMaxDrops: 3,
|
|
96
|
+
diameterOverride: 0.75,
|
|
97
|
+
health: 1550,
|
|
98
|
+
idleAnimations: [ 'idle' ],
|
|
99
|
+
modelUri: 'models/enemies/gorkin-chieftan.gltf',
|
|
100
|
+
modelPreferredShape: ColliderShape.CAPSULE,
|
|
101
|
+
modelScale: 1.1,
|
|
102
|
+
moveAnimations: [ 'fastwalk' ],
|
|
103
|
+
moveSpeed: 5,
|
|
104
|
+
moveAnimationSpeed: 1.25,
|
|
105
|
+
name: 'Gorkin Chieftan',
|
|
106
|
+
nameplateType: 'boss',
|
|
107
|
+
rigidBodyOptions: {
|
|
108
|
+
type: RigidBodyType.DYNAMIC,
|
|
109
|
+
colliders: [ // manually sized collider since the chain whip breaks auto calculations
|
|
110
|
+
{
|
|
111
|
+
shape: ColliderShape.CAPSULE,
|
|
112
|
+
halfHeight: 0.8,
|
|
113
|
+
radius: 0.75,
|
|
114
|
+
},
|
|
115
|
+
],
|
|
116
|
+
},
|
|
117
|
+
pathfindingOptions: {
|
|
118
|
+
maxJump: 3,
|
|
119
|
+
maxFall: 3,
|
|
120
|
+
},
|
|
121
|
+
...options,
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
this._stompParticleEmitter = new ParticleEmitter({
|
|
125
|
+
textureUri: 'particles/dirt.png',
|
|
126
|
+
attachedToEntity: this,
|
|
127
|
+
colorStart: { r: 194, g: 164, b: 132 },
|
|
128
|
+
offset: { x: 0, y: -1, z: 0 },
|
|
129
|
+
size: 1,
|
|
130
|
+
sizeVariance: 1,
|
|
131
|
+
lifetime: 5,
|
|
132
|
+
lifetimeVariance: 3,
|
|
133
|
+
rate: 125,
|
|
134
|
+
maxParticles: 250,
|
|
135
|
+
velocity: { x: 0, y: 6, z: 0 },
|
|
136
|
+
velocityVariance: { x: 6, y: 2, z: 6 },
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
public override spawn(world: World, position: Vector3Like, rotation: QuaternionLike) {
|
|
141
|
+
super.spawn(world, position, rotation);
|
|
142
|
+
this._stompParticleEmitter.spawn(world);
|
|
143
|
+
this._stompParticleEmitter.stop();
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
private _doubleSlashAttack(target: BaseEntity | GamePlayerEntity) {
|
|
147
|
+
this.processSimpleAttack(target, this.attacks[2]);
|
|
148
|
+
setTimeout(() => this.processSimpleAttack(target, this.attacks[2]), 650);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
private _slashStabAttack(target: BaseEntity | GamePlayerEntity) {
|
|
152
|
+
this.processSimpleAttack(target, this.attacks[0]);
|
|
153
|
+
setTimeout(() => this.processSimpleAttack(target, this.attacks[0]), 1000);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
private _stompAttack() {
|
|
157
|
+
if (!this.world) return;
|
|
158
|
+
|
|
159
|
+
this._stompParticleEmitter.restart();
|
|
160
|
+
setTimeout(() => this._stompParticleEmitter.stop(), 500);
|
|
161
|
+
|
|
162
|
+
const aoeCollider = new Collider({
|
|
163
|
+
shape: ColliderShape.CYLINDER,
|
|
164
|
+
halfHeight: this.height / 2,
|
|
165
|
+
radius: Math.sqrt(this.diameterSquared) / 2 + 3,
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
const targets = this.getTargetsByRawShapeIntersection(
|
|
169
|
+
aoeCollider.rawShape,
|
|
170
|
+
this.position,
|
|
171
|
+
this.rotation,
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
for (const target of targets) {
|
|
175
|
+
if (!target.isSpawned || !isDamageable(target)) continue;
|
|
176
|
+
|
|
177
|
+
target.takeDamage(this.calculateDamageWithVariance(80, 0.2));
|
|
178
|
+
|
|
179
|
+
// Ignore impulse if dodging.
|
|
180
|
+
if (target instanceof GamePlayerEntity && target.isDodging) continue;
|
|
181
|
+
|
|
182
|
+
const direction = this.calculateDirectionToTargetPosition(target.position);
|
|
183
|
+
target.applyImpulse({
|
|
184
|
+
x: direction.x * 13 * target.mass,
|
|
185
|
+
y: 5 * target.mass,
|
|
186
|
+
z: direction.z * 13 * target.mass,
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { ColliderShape, RigidBodyType } from "hytopia";
|
|
2
|
+
import BaseCombatEntity, { BaseCombatEntityOptions } from "../BaseCombatEntity";
|
|
3
|
+
import GamePlayerEntity from "../../GamePlayerEntity";
|
|
4
|
+
|
|
5
|
+
// Aggro Target Types
|
|
6
|
+
import ReclusiveWeaverEntity from "./ReclusiveWeaverEntity";
|
|
7
|
+
|
|
8
|
+
// Drops
|
|
9
|
+
import GoldItem from "../../items/general/GoldItem";
|
|
10
|
+
import GorkinEarItem from "../../items/materials/GorkinEarItem";
|
|
11
|
+
import GorkinEyeItem from "../../items/materials/GorkinEyeItem";
|
|
12
|
+
import GorkinFootItem from "../../items/materials/GorkinFootItem";
|
|
13
|
+
import GorkinHandItem from "../../items/materials/GorkinHandItem";
|
|
14
|
+
import GorkinSkullItem from "../../items/materials/GorkinSkullItem";
|
|
15
|
+
import IronIngotItem from "../../items/materials/IronIngotItem";
|
|
16
|
+
import ShatteredSwordItem from "../../items/materials/ShatteredSwordItem";
|
|
17
|
+
import ShackleItem from "../../items/materials/ShackleItem";
|
|
18
|
+
import ToughMonsterHide from "../../items/materials/ToughMonsterHide";
|
|
19
|
+
|
|
20
|
+
export type GorkinEnforcerEntityOptions = {
|
|
21
|
+
|
|
22
|
+
} & Partial<BaseCombatEntityOptions>;
|
|
23
|
+
|
|
24
|
+
export default class GorkinEnforcerEntity extends BaseCombatEntity {
|
|
25
|
+
constructor(options?: GorkinEnforcerEntityOptions) {
|
|
26
|
+
super({
|
|
27
|
+
aggroRadius: 9,
|
|
28
|
+
aggroSensorForwardOffset: 3,
|
|
29
|
+
aggroTargetTypes: [
|
|
30
|
+
GamePlayerEntity,
|
|
31
|
+
ReclusiveWeaverEntity,
|
|
32
|
+
],
|
|
33
|
+
attacks: [
|
|
34
|
+
{
|
|
35
|
+
animations: [ 'atk1' ],
|
|
36
|
+
cooldownMs: 3000,
|
|
37
|
+
range: 5, // width/depth calculation is messed up and too large because of the model idle shape, so we use 0
|
|
38
|
+
simpleAttackDamage: 38,
|
|
39
|
+
simpleAttackDamageVariance: 0.2,
|
|
40
|
+
simpleAttackDamageDelayMs: 800,
|
|
41
|
+
stopAllAnimationForMs: 1900,
|
|
42
|
+
stopMovingForDurationMs: 1900,
|
|
43
|
+
weight: 1,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
combatExperienceReward: 65,
|
|
47
|
+
deathAnimations: [ 'death' ],
|
|
48
|
+
deathDespawnDelayMs: 2400,
|
|
49
|
+
deathItemDrops: [
|
|
50
|
+
{ itemClass: GoldItem, minQuantity: 18, maxQuantity: 27, weight: 5 },
|
|
51
|
+
{ itemClass: GorkinSkullItem, weight: 4 },
|
|
52
|
+
{ itemClass: GorkinEarItem, minQuantity: 1, maxQuantity: 2, weight: 4 },
|
|
53
|
+
{ itemClass: GorkinEyeItem, minQuantity: 1, maxQuantity: 2, weight: 3 },
|
|
54
|
+
{ itemClass: GorkinFootItem, minQuantity: 1, maxQuantity: 2, weight: 3 },
|
|
55
|
+
{ itemClass: GorkinHandItem, minQuantity: 1, maxQuantity: 2, weight: 3 },
|
|
56
|
+
{ itemClass: ShatteredSwordItem, weight: 3 },
|
|
57
|
+
{ itemClass: ToughMonsterHide, weight: 3 },
|
|
58
|
+
{ itemClass: IronIngotItem, minQuantity: 1, maxQuantity: 2, weight: 2 },
|
|
59
|
+
{ itemClass: ShackleItem, weight: 2 },
|
|
60
|
+
],
|
|
61
|
+
diameterOverride: 0.75,
|
|
62
|
+
health: 230,
|
|
63
|
+
idleAnimations: [ 'idle' ],
|
|
64
|
+
modelUri: 'models/enemies/gorkin-enforcer.gltf',
|
|
65
|
+
modelPreferredShape: ColliderShape.CAPSULE,
|
|
66
|
+
modelScale: 0.9,
|
|
67
|
+
moveAnimations: [ 'walk' ],
|
|
68
|
+
moveSpeed: 3,
|
|
69
|
+
name: 'Gorkin Enforcer',
|
|
70
|
+
rigidBodyOptions: {
|
|
71
|
+
type: RigidBodyType.DYNAMIC,
|
|
72
|
+
colliders: [ // manually sized collider since the chain whip breaks auto calculations
|
|
73
|
+
{
|
|
74
|
+
shape: ColliderShape.CAPSULE,
|
|
75
|
+
halfHeight: 0.35,
|
|
76
|
+
radius: 0.65,
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
},
|
|
80
|
+
pathfindingOptions: {
|
|
81
|
+
maxJump: 2,
|
|
82
|
+
maxFall: 2,
|
|
83
|
+
},
|
|
84
|
+
...options,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import BaseCombatEntity, { BaseCombatEntityOptions } from "../BaseCombatEntity";
|
|
2
|
+
import GamePlayerEntity from "../../GamePlayerEntity";
|
|
3
|
+
import type BaseEntity from "../BaseEntity";
|
|
4
|
+
|
|
5
|
+
// Aggro Target Types
|
|
6
|
+
import RatkinBruteEntity from "./RatkinBruteEntity";
|
|
7
|
+
import RatkinRangerEntity from "./RatkinRangerEntity";
|
|
8
|
+
import RatkinSpellcasterEntity from "./RatkinSpellcasterEntity";
|
|
9
|
+
import RatkinWarriorEntity from "./RatkinWarriorEntity";
|
|
10
|
+
import ReclusiveWeaverEntity from "./ReclusiveWeaverEntity";
|
|
11
|
+
|
|
12
|
+
// Drops
|
|
13
|
+
import GoldItem from "../../items/general/GoldItem";
|
|
14
|
+
import GorkinEarItem from "../../items/materials/GorkinEarItem";
|
|
15
|
+
import GorkinEyeItem from "../../items/materials/GorkinEyeItem";
|
|
16
|
+
import GorkinFootItem from "../../items/materials/GorkinFootItem";
|
|
17
|
+
import GorkinHandItem from "../../items/materials/GorkinHandItem";
|
|
18
|
+
import GorkinSkullItem from "../../items/materials/GorkinSkullItem";
|
|
19
|
+
import IronIngotItem from "../../items/materials/IronIngotItem";
|
|
20
|
+
import ShatteredSwordItem from "../../items/materials/ShatteredSwordItem";
|
|
21
|
+
import ShackleItem from "../../items/materials/ShackleItem";
|
|
22
|
+
import ToughMonsterHide from "../../items/materials/ToughMonsterHide";
|
|
23
|
+
|
|
24
|
+
export type GorkinGruntEntityOptions = {
|
|
25
|
+
|
|
26
|
+
} & Partial<BaseCombatEntityOptions>;
|
|
27
|
+
|
|
28
|
+
export default class GorkinGruntEntity extends BaseCombatEntity {
|
|
29
|
+
constructor(options?: GorkinGruntEntityOptions) {
|
|
30
|
+
super({
|
|
31
|
+
aggroRadius: 9,
|
|
32
|
+
aggroSensorForwardOffset: 3,
|
|
33
|
+
aggroTargetTypes: [
|
|
34
|
+
GamePlayerEntity,
|
|
35
|
+
RatkinBruteEntity,
|
|
36
|
+
RatkinRangerEntity,
|
|
37
|
+
RatkinSpellcasterEntity,
|
|
38
|
+
RatkinWarriorEntity,
|
|
39
|
+
ReclusiveWeaverEntity,
|
|
40
|
+
],
|
|
41
|
+
attacks: [
|
|
42
|
+
{ // Light attack
|
|
43
|
+
animations: [ 'atk1' ],
|
|
44
|
+
cooldownMs: 2000,
|
|
45
|
+
range: 1.5,
|
|
46
|
+
simpleAttackDamage: 27,
|
|
47
|
+
simpleAttackDamageVariance: 0.2,
|
|
48
|
+
simpleAttackDamageDelayMs: 800,
|
|
49
|
+
simpleAttackReach: 2,
|
|
50
|
+
stopAllAnimationForMs: 1400,
|
|
51
|
+
stopMovingForDurationMs: 1400,
|
|
52
|
+
weight: 1,
|
|
53
|
+
},
|
|
54
|
+
{ // Double swing attack
|
|
55
|
+
animations: [ 'atk2' ],
|
|
56
|
+
complexAttack: (params) => this._doubleSwingAttack(params.target),
|
|
57
|
+
complexAttackDelayMs: 700,
|
|
58
|
+
cooldownMs: 2000,
|
|
59
|
+
simpleAttackDamage: 30, // complex attack triggers simple attack processing
|
|
60
|
+
simpleAttackDamageVariance: 0.3,
|
|
61
|
+
stopAllAnimationForMs: 1800,
|
|
62
|
+
stopMovingForDurationMs: 2200,
|
|
63
|
+
range: 1.5,
|
|
64
|
+
weight: 1,
|
|
65
|
+
},
|
|
66
|
+
{ // Heavy attack
|
|
67
|
+
animations: [ 'atk3' ],
|
|
68
|
+
cooldownMs: 2000,
|
|
69
|
+
stopAllAnimationForMs: 1450,
|
|
70
|
+
stopMovingForDurationMs: 1450,
|
|
71
|
+
range: 1.5,
|
|
72
|
+
simpleAttackDamage: 36,
|
|
73
|
+
simpleAttackDamageVariance: 0.2,
|
|
74
|
+
simpleAttackDamageDelayMs: 500,
|
|
75
|
+
simpleAttackReach: 2,
|
|
76
|
+
weight: 1,
|
|
77
|
+
},
|
|
78
|
+
],
|
|
79
|
+
combatExperienceReward: 50,
|
|
80
|
+
deathAnimations: [ 'death' ],
|
|
81
|
+
deathDespawnDelayMs: 2400,
|
|
82
|
+
deathItemDrops: [
|
|
83
|
+
{ itemClass: GoldItem, minQuantity: 14, maxQuantity: 24, weight: 5 },
|
|
84
|
+
{ itemClass: GorkinSkullItem, weight: 4 },
|
|
85
|
+
{ itemClass: GorkinEarItem, minQuantity: 1, maxQuantity: 2, weight: 4 },
|
|
86
|
+
{ itemClass: GorkinEyeItem, minQuantity: 1, maxQuantity: 2, weight: 3 },
|
|
87
|
+
{ itemClass: GorkinFootItem, minQuantity: 1, maxQuantity: 2, weight: 3 },
|
|
88
|
+
{ itemClass: GorkinHandItem, minQuantity: 1, maxQuantity: 2, weight: 3 },
|
|
89
|
+
{ itemClass: ToughMonsterHide, weight: 3 },
|
|
90
|
+
{ itemClass: ShatteredSwordItem, weight: 1 },
|
|
91
|
+
{ itemClass: IronIngotItem, minQuantity: 1, maxQuantity: 2, weight: 1 },
|
|
92
|
+
{ itemClass: ShackleItem, weight: 1 },
|
|
93
|
+
],
|
|
94
|
+
health: 170,
|
|
95
|
+
idleAnimations: [ 'idle' ],
|
|
96
|
+
modelUri: 'models/enemies/gorkin-grunt.gltf',
|
|
97
|
+
modelScale: 0.9,
|
|
98
|
+
moveAnimations: [ 'walk' ],
|
|
99
|
+
moveSpeed: 3,
|
|
100
|
+
name: 'Gorkin Grunt',
|
|
101
|
+
pathfindingOptions: {
|
|
102
|
+
maxJump: 2,
|
|
103
|
+
maxFall: 2,
|
|
104
|
+
},
|
|
105
|
+
...options,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
private _doubleSwingAttack(target: BaseEntity | GamePlayerEntity) {
|
|
110
|
+
this.processSimpleAttack(target, this.attacks[1]);
|
|
111
|
+
setTimeout(() => this.processSimpleAttack(target, this.attacks[1]), 700);
|
|
112
|
+
}
|
|
113
|
+
}
|