@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.
Files changed (347) hide show
  1. package/frontiers-rpg-game/assets/avatars/bookshelf.png +0 -0
  2. package/frontiers-rpg-game/assets/avatars/gravekeeper.png +0 -0
  3. package/frontiers-rpg-game/assets/avatars/herder.png +0 -0
  4. package/frontiers-rpg-game/assets/blocks/bricks.png +0 -0
  5. package/frontiers-rpg-game/assets/blocks/clay.png +0 -0
  6. package/frontiers-rpg-game/assets/blocks/coal-ore.png +0 -0
  7. package/frontiers-rpg-game/assets/blocks/cobblestone-mossy.png +0 -0
  8. package/frontiers-rpg-game/assets/blocks/cobblestone.png +0 -0
  9. package/frontiers-rpg-game/assets/blocks/creep.png +0 -0
  10. package/frontiers-rpg-game/assets/blocks/diamond-ore.png +0 -0
  11. package/frontiers-rpg-game/assets/blocks/emerald-block.png +0 -0
  12. package/frontiers-rpg-game/assets/blocks/emerald-ore.png +0 -0
  13. package/frontiers-rpg-game/assets/blocks/glass.png +0 -0
  14. package/frontiers-rpg-game/assets/blocks/gold-ore.png +0 -0
  15. package/frontiers-rpg-game/assets/blocks/green_fungus/+x.png +0 -0
  16. package/frontiers-rpg-game/assets/blocks/green_fungus/+y.png +0 -0
  17. package/frontiers-rpg-game/assets/blocks/green_fungus/+z.png +0 -0
  18. package/frontiers-rpg-game/assets/blocks/green_fungus/-x.png +0 -0
  19. package/frontiers-rpg-game/assets/blocks/green_fungus/-y.png +0 -0
  20. package/frontiers-rpg-game/assets/blocks/green_fungus/-z.png +0 -0
  21. package/frontiers-rpg-game/assets/blocks/log/+x.png +0 -0
  22. package/frontiers-rpg-game/assets/blocks/log/+y.png +0 -0
  23. package/frontiers-rpg-game/assets/blocks/log/+z.png +0 -0
  24. package/frontiers-rpg-game/assets/blocks/log/-x.png +0 -0
  25. package/frontiers-rpg-game/assets/blocks/log/-y.png +0 -0
  26. package/frontiers-rpg-game/assets/blocks/log/-z.png +0 -0
  27. package/frontiers-rpg-game/assets/blocks/mossy_dirt/+x.png +0 -0
  28. package/frontiers-rpg-game/assets/blocks/mossy_dirt/+y.png +0 -0
  29. package/frontiers-rpg-game/assets/blocks/mossy_dirt/+z.png +0 -0
  30. package/frontiers-rpg-game/assets/blocks/mossy_dirt/-x.png +0 -0
  31. package/frontiers-rpg-game/assets/blocks/mossy_dirt/-y.png +0 -0
  32. package/frontiers-rpg-game/assets/blocks/mossy_dirt/-z.png +0 -0
  33. package/frontiers-rpg-game/assets/blocks/murky-water.png +0 -0
  34. package/frontiers-rpg-game/assets/blocks/mushroom_top/+x.png +0 -0
  35. package/frontiers-rpg-game/assets/blocks/mushroom_top/+y.png +0 -0
  36. package/frontiers-rpg-game/assets/blocks/mushroom_top/+z.png +0 -0
  37. package/frontiers-rpg-game/assets/blocks/mushroom_top/-x.png +0 -0
  38. package/frontiers-rpg-game/assets/blocks/mushroom_top/-y.png +0 -0
  39. package/frontiers-rpg-game/assets/blocks/mushroom_top/-z.png +0 -0
  40. package/frontiers-rpg-game/assets/blocks/oak-planks-leafy.png +0 -0
  41. package/frontiers-rpg-game/assets/blocks/oak-planks-leafyer.png +0 -0
  42. package/frontiers-rpg-game/assets/blocks/oak-planks-leafyerer.png +0 -0
  43. package/frontiers-rpg-game/assets/blocks/sand.png +0 -0
  44. package/frontiers-rpg-game/assets/blocks/sandstone.png +0 -0
  45. package/frontiers-rpg-game/assets/blocks/shadowrock.png +0 -0
  46. package/frontiers-rpg-game/assets/blocks/snow-rough.png +0 -0
  47. package/frontiers-rpg-game/assets/blocks/snow.png +0 -0
  48. package/frontiers-rpg-game/assets/icons/items/brittle-nails.png +0 -0
  49. package/frontiers-rpg-game/assets/icons/items/chieftan-blade.png +0 -0
  50. package/frontiers-rpg-game/assets/icons/items/gold-ingot.png +0 -0
  51. package/frontiers-rpg-game/assets/icons/items/gorkin-ear.png +0 -0
  52. package/frontiers-rpg-game/assets/icons/items/gorkin-eye.png +0 -0
  53. package/frontiers-rpg-game/assets/icons/items/gorkin-foot.png +0 -0
  54. package/frontiers-rpg-game/assets/icons/items/gorkin-hand.png +0 -0
  55. package/frontiers-rpg-game/assets/icons/items/gorkin-skull.png +0 -0
  56. package/frontiers-rpg-game/assets/icons/items/healing-potion.png +0 -0
  57. package/frontiers-rpg-game/assets/icons/items/iron-chestplate.png +0 -0
  58. package/frontiers-rpg-game/assets/icons/items/iron-gauntlets.png +0 -0
  59. package/frontiers-rpg-game/assets/icons/items/iron-grieves.png +0 -0
  60. package/frontiers-rpg-game/assets/icons/items/iron-helmet.png +0 -0
  61. package/frontiers-rpg-game/assets/icons/items/iron-ingot.png +0 -0
  62. package/frontiers-rpg-game/assets/icons/items/iron-leggings.png +0 -0
  63. package/frontiers-rpg-game/assets/icons/items/shackle.png +0 -0
  64. package/frontiers-rpg-game/assets/icons/items/shattered-sword.png +0 -0
  65. package/frontiers-rpg-game/assets/icons/items/silver-slab.png +0 -0
  66. package/frontiers-rpg-game/assets/icons/items/tough-monster-hide.png +0 -0
  67. package/frontiers-rpg-game/assets/icons/items/weaver-carapace.png +0 -0
  68. package/frontiers-rpg-game/assets/icons/items/weaver-egg.png +0 -0
  69. package/frontiers-rpg-game/assets/icons/items/weaver-heart.png +0 -0
  70. package/frontiers-rpg-game/assets/icons/items/weaver-silk.png +0 -0
  71. package/frontiers-rpg-game/assets/icons/items/woolran-scroll.png +0 -0
  72. package/frontiers-rpg-game/assets/maps/chitter-forest.json +5193 -5203
  73. package/frontiers-rpg-game/assets/maps/hearthwilds.json +21381 -2612
  74. package/frontiers-rpg-game/assets/models/enemies/.optimized/angler/angler-named-nodes.bin +0 -0
  75. package/frontiers-rpg-game/assets/models/enemies/.optimized/angler/angler-named-nodes.gltf +5472 -0
  76. package/frontiers-rpg-game/assets/models/enemies/.optimized/angler/angler.bin +0 -0
  77. package/frontiers-rpg-game/assets/models/enemies/.optimized/angler/angler.gltf +4122 -0
  78. package/frontiers-rpg-game/assets/models/enemies/.optimized/angler/angler.gltf.md5 +1 -0
  79. package/frontiers-rpg-game/assets/models/enemies/.optimized/angler/baseColor.png +0 -0
  80. package/frontiers-rpg-game/assets/models/enemies/.optimized/blight-knight-ceres/baseColor.png +0 -0
  81. package/frontiers-rpg-game/assets/models/enemies/.optimized/blight-knight-ceres/blight-knight-ceres-named-nodes.bin +0 -0
  82. package/frontiers-rpg-game/assets/models/enemies/.optimized/blight-knight-ceres/blight-knight-ceres-named-nodes.gltf +17967 -0
  83. package/frontiers-rpg-game/assets/models/enemies/.optimized/blight-knight-ceres/blight-knight-ceres.bin +0 -0
  84. package/frontiers-rpg-game/assets/models/enemies/.optimized/blight-knight-ceres/blight-knight-ceres.gltf +17403 -0
  85. package/frontiers-rpg-game/assets/models/enemies/.optimized/blight-knight-ceres/blight-knight-ceres.gltf.md5 +1 -0
  86. package/frontiers-rpg-game/assets/models/enemies/.optimized/blighted-capfolk/baseColor.png +0 -0
  87. package/frontiers-rpg-game/assets/models/enemies/.optimized/blighted-capfolk/blighted-capfolk-named-nodes.bin +0 -0
  88. package/frontiers-rpg-game/assets/models/enemies/.optimized/blighted-capfolk/blighted-capfolk-named-nodes.gltf +1658 -0
  89. package/frontiers-rpg-game/assets/models/enemies/.optimized/blighted-capfolk/blighted-capfolk.bin +0 -0
  90. package/frontiers-rpg-game/assets/models/enemies/.optimized/blighted-capfolk/blighted-capfolk.gltf +1658 -0
  91. package/frontiers-rpg-game/assets/models/enemies/.optimized/blighted-capfolk/blighted-capfolk.gltf.md5 +1 -0
  92. package/frontiers-rpg-game/assets/models/enemies/.optimized/capfolk-guardian/baseColor.png +0 -0
  93. package/frontiers-rpg-game/assets/models/enemies/.optimized/capfolk-guardian/capfolk-guardian-named-nodes.bin +0 -0
  94. package/frontiers-rpg-game/assets/models/enemies/.optimized/capfolk-guardian/capfolk-guardian-named-nodes.gltf +9410 -0
  95. package/frontiers-rpg-game/assets/models/enemies/.optimized/capfolk-guardian/capfolk-guardian.bin +0 -0
  96. package/frontiers-rpg-game/assets/models/enemies/.optimized/capfolk-guardian/capfolk-guardian.gltf +4261 -0
  97. package/frontiers-rpg-game/assets/models/enemies/.optimized/capfolk-guardian/capfolk-guardian.gltf.md5 +1 -0
  98. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/baseColor_1.png +0 -0
  99. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/baseColor_2.png +0 -0
  100. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/gorkin-archer-named-nodes.bin +0 -0
  101. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/gorkin-archer-named-nodes.gltf +6093 -0
  102. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/gorkin-archer.bin +0 -0
  103. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/gorkin-archer.gltf +4430 -0
  104. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-archer/gorkin-archer.gltf.md5 +1 -0
  105. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/baseColor_1.png +0 -0
  106. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/baseColor_2.png +0 -0
  107. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/gorkin-assassin-named-nodes.bin +0 -0
  108. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/gorkin-assassin-named-nodes.gltf +5441 -0
  109. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/gorkin-assassin.bin +0 -0
  110. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/gorkin-assassin.gltf +4084 -0
  111. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-assassin/gorkin-assassin.gltf.md5 +1 -0
  112. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-blademaster/baseColor.png +0 -0
  113. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-blademaster/gorkin-blademaster-named-nodes.bin +0 -0
  114. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-blademaster/gorkin-blademaster-named-nodes.gltf +5302 -0
  115. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-blademaster/gorkin-blademaster.bin +0 -0
  116. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-blademaster/gorkin-blademaster.gltf +4134 -0
  117. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-blademaster/gorkin-blademaster.gltf.md5 +1 -0
  118. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-chieftan/baseColor.png +0 -0
  119. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-chieftan/gorkin-chieftan-named-nodes.bin +0 -0
  120. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-chieftan/gorkin-chieftan-named-nodes.gltf +7052 -0
  121. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-chieftan/gorkin-chieftan.bin +0 -0
  122. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-chieftan/gorkin-chieftan.gltf +5581 -0
  123. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-chieftan/gorkin-chieftan.gltf.md5 +1 -0
  124. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-enforcer/baseColor.png +0 -0
  125. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-enforcer/gorkin-enforcer-named-nodes.bin +0 -0
  126. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-enforcer/gorkin-enforcer-named-nodes.gltf +4086 -0
  127. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-enforcer/gorkin-enforcer.bin +0 -0
  128. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-enforcer/gorkin-enforcer.gltf +3472 -0
  129. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-enforcer/gorkin-enforcer.gltf.md5 +1 -0
  130. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-grunt/baseColor.png +0 -0
  131. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-grunt/gorkin-grunt-named-nodes.bin +0 -0
  132. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-grunt/gorkin-grunt-named-nodes.gltf +3698 -0
  133. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-grunt/gorkin-grunt.bin +0 -0
  134. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-grunt/gorkin-grunt.gltf +3193 -0
  135. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-grunt/gorkin-grunt.gltf.md5 +1 -0
  136. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-hunter/baseColor.png +0 -0
  137. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-hunter/gorkin-hunter-named-nodes.bin +0 -0
  138. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-hunter/gorkin-hunter-named-nodes.gltf +3985 -0
  139. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-hunter/gorkin-hunter.bin +0 -0
  140. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-hunter/gorkin-hunter.gltf +3092 -0
  141. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-hunter/gorkin-hunter.gltf.md5 +1 -0
  142. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-shaman/baseColor.png +0 -0
  143. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-shaman/gorkin-shaman-named-nodes.bin +0 -0
  144. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-shaman/gorkin-shaman-named-nodes.gltf +3850 -0
  145. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-shaman/gorkin-shaman.bin +0 -0
  146. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-shaman/gorkin-shaman.gltf +3100 -0
  147. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-shaman/gorkin-shaman.gltf.md5 +1 -0
  148. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-swordsman/baseColor.png +0 -0
  149. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-swordsman/gorkin-swordsman-named-nodes.bin +0 -0
  150. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-swordsman/gorkin-swordsman-named-nodes.gltf +4087 -0
  151. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-swordsman/gorkin-swordsman.bin +0 -0
  152. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-swordsman/gorkin-swordsman.gltf +3582 -0
  153. package/frontiers-rpg-game/assets/models/enemies/.optimized/gorkin-swordsman/gorkin-swordsman.gltf.md5 +1 -0
  154. package/frontiers-rpg-game/assets/models/enemies/.optimized/mother-viper/baseColor.png +0 -0
  155. package/frontiers-rpg-game/assets/models/enemies/.optimized/mother-viper/mother-viper-named-nodes.bin +0 -0
  156. package/frontiers-rpg-game/assets/models/enemies/.optimized/mother-viper/mother-viper-named-nodes.gltf +4212 -0
  157. package/frontiers-rpg-game/assets/models/enemies/.optimized/mother-viper/mother-viper.bin +0 -0
  158. package/frontiers-rpg-game/assets/models/enemies/.optimized/mother-viper/mother-viper.gltf +3993 -0
  159. package/frontiers-rpg-game/assets/models/enemies/.optimized/mother-viper/mother-viper.gltf.md5 +1 -0
  160. package/frontiers-rpg-game/assets/models/enemies/.optimized/reclusive-weaver/baseColor.png +0 -0
  161. package/frontiers-rpg-game/assets/models/enemies/.optimized/reclusive-weaver/reclusive-weaver-named-nodes.bin +0 -0
  162. package/frontiers-rpg-game/assets/models/enemies/.optimized/reclusive-weaver/reclusive-weaver-named-nodes.gltf +7978 -0
  163. package/frontiers-rpg-game/assets/models/enemies/.optimized/reclusive-weaver/reclusive-weaver.bin +0 -0
  164. package/frontiers-rpg-game/assets/models/enemies/.optimized/reclusive-weaver/reclusive-weaver.gltf +7978 -0
  165. package/frontiers-rpg-game/assets/models/enemies/.optimized/reclusive-weaver/reclusive-weaver.gltf.md5 +1 -0
  166. package/frontiers-rpg-game/assets/models/enemies/.optimized/sickly-capfolk/baseColor.png +0 -0
  167. package/frontiers-rpg-game/assets/models/enemies/.optimized/sickly-capfolk/sickly-capfolk-named-nodes.bin +0 -0
  168. package/frontiers-rpg-game/assets/models/enemies/.optimized/sickly-capfolk/sickly-capfolk-named-nodes.gltf +1708 -0
  169. package/frontiers-rpg-game/assets/models/enemies/.optimized/sickly-capfolk/sickly-capfolk.bin +0 -0
  170. package/frontiers-rpg-game/assets/models/enemies/.optimized/sickly-capfolk/sickly-capfolk.gltf +1667 -0
  171. package/frontiers-rpg-game/assets/models/enemies/.optimized/sickly-capfolk/sickly-capfolk.gltf.md5 +1 -0
  172. package/frontiers-rpg-game/assets/models/enemies/.optimized/snapjaw/baseColor.png +0 -0
  173. package/frontiers-rpg-game/assets/models/enemies/.optimized/snapjaw/snapjaw-named-nodes.bin +0 -0
  174. package/frontiers-rpg-game/assets/models/enemies/.optimized/snapjaw/snapjaw-named-nodes.gltf +12107 -0
  175. package/frontiers-rpg-game/assets/models/enemies/.optimized/snapjaw/snapjaw.bin +0 -0
  176. package/frontiers-rpg-game/assets/models/enemies/.optimized/snapjaw/snapjaw.gltf +9663 -0
  177. package/frontiers-rpg-game/assets/models/enemies/.optimized/snapjaw/snapjaw.gltf.md5 +1 -0
  178. package/frontiers-rpg-game/assets/models/enemies/.optimized/toxic-frog/baseColor.png +0 -0
  179. package/frontiers-rpg-game/assets/models/enemies/.optimized/toxic-frog/toxic-frog-named-nodes.bin +0 -0
  180. package/frontiers-rpg-game/assets/models/enemies/.optimized/toxic-frog/toxic-frog-named-nodes.gltf +5550 -0
  181. package/frontiers-rpg-game/assets/models/enemies/.optimized/toxic-frog/toxic-frog.bin +0 -0
  182. package/frontiers-rpg-game/assets/models/enemies/.optimized/toxic-frog/toxic-frog.gltf +5550 -0
  183. package/frontiers-rpg-game/assets/models/enemies/.optimized/toxic-frog/toxic-frog.gltf.md5 +1 -0
  184. package/frontiers-rpg-game/assets/models/enemies/angler.gltf +1 -0
  185. package/frontiers-rpg-game/assets/models/enemies/blight-knight-ceres.gltf +1 -0
  186. package/frontiers-rpg-game/assets/models/enemies/blighted-capfolk.gltf +1 -0
  187. package/frontiers-rpg-game/assets/models/enemies/capfolk-guardian.gltf +1 -0
  188. package/frontiers-rpg-game/assets/models/enemies/gorkin-chieftan.gltf +1 -0
  189. package/frontiers-rpg-game/assets/models/enemies/gorkin-enforcer.gltf +1 -0
  190. package/frontiers-rpg-game/assets/models/enemies/gorkin-grunt.gltf +1 -0
  191. package/frontiers-rpg-game/assets/models/enemies/gorkin-hunter.gltf +1 -0
  192. package/frontiers-rpg-game/assets/models/enemies/gorkin-shaman.gltf +1 -0
  193. package/frontiers-rpg-game/assets/models/enemies/gorkin-swordsman.gltf +1 -0
  194. package/frontiers-rpg-game/assets/models/enemies/reclusive-weaver.gltf +1 -0
  195. package/frontiers-rpg-game/assets/models/enemies/sickly-capfolk.gltf +1 -0
  196. package/frontiers-rpg-game/assets/models/enemies/snapjaw.gltf +1 -0
  197. package/frontiers-rpg-game/assets/models/enemies/toxic-frog.gltf +1 -0
  198. package/frontiers-rpg-game/assets/models/environment/.optimized/banner-hytopia-1/banner-hytopia-1-named-nodes.bin +0 -0
  199. package/frontiers-rpg-game/assets/models/environment/.optimized/banner-hytopia-1/banner-hytopia-1-named-nodes.gltf +260 -0
  200. package/frontiers-rpg-game/assets/models/environment/.optimized/banner-hytopia-1/banner-hytopia-1.bin +0 -0
  201. package/frontiers-rpg-game/assets/models/environment/.optimized/banner-hytopia-1/banner-hytopia-1.gltf +136 -0
  202. package/frontiers-rpg-game/assets/models/environment/.optimized/banner-hytopia-1/banner-hytopia-1.gltf.md5 +1 -0
  203. package/frontiers-rpg-game/assets/models/environment/.optimized/banner-hytopia-1/baseColor.png +0 -0
  204. package/frontiers-rpg-game/assets/models/environment/.optimized/bookshelf/baseColor.png +0 -0
  205. package/frontiers-rpg-game/assets/models/environment/.optimized/bookshelf/bookshelf-named-nodes.bin +0 -0
  206. package/frontiers-rpg-game/assets/models/environment/.optimized/bookshelf/bookshelf-named-nodes.gltf +882 -0
  207. package/frontiers-rpg-game/assets/models/environment/.optimized/bookshelf/bookshelf.bin +0 -0
  208. package/frontiers-rpg-game/assets/models/environment/.optimized/bookshelf/bookshelf.gltf +136 -0
  209. package/frontiers-rpg-game/assets/models/environment/.optimized/bookshelf/bookshelf.gltf.md5 +1 -0
  210. package/frontiers-rpg-game/assets/models/environment/.optimized/training-dummy/baseColor.png +0 -0
  211. package/frontiers-rpg-game/assets/models/environment/.optimized/training-dummy/training-dummy-named-nodes.bin +0 -0
  212. package/frontiers-rpg-game/assets/models/environment/.optimized/training-dummy/training-dummy-named-nodes.gltf +1312 -0
  213. package/frontiers-rpg-game/assets/models/environment/.optimized/training-dummy/training-dummy.bin +0 -0
  214. package/frontiers-rpg-game/assets/models/environment/.optimized/training-dummy/training-dummy.gltf +1006 -0
  215. package/frontiers-rpg-game/assets/models/environment/.optimized/training-dummy/training-dummy.gltf.md5 +1 -0
  216. package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/baseColor_1.png +0 -0
  217. package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/baseColor_2.png +0 -0
  218. package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/baseColor_3.png +0 -0
  219. package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/baseColor_4.png +0 -0
  220. package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/weapon-rack-named-nodes.bin +0 -0
  221. package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/weapon-rack-named-nodes.gltf +909 -0
  222. package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/weapon-rack.bin +0 -0
  223. package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/weapon-rack.gltf +418 -0
  224. package/frontiers-rpg-game/assets/models/environment/.optimized/weapon-rack/weapon-rack.gltf.md5 +1 -0
  225. package/frontiers-rpg-game/assets/models/environment/banner-hytopia-1.gltf +1 -0
  226. package/frontiers-rpg-game/assets/models/environment/bookshelf.gltf +1 -0
  227. package/frontiers-rpg-game/assets/models/environment/training-dummy.gltf +1 -0
  228. package/frontiers-rpg-game/assets/models/environment/weapon-rack.gltf +1 -0
  229. package/frontiers-rpg-game/assets/models/forageables/.optimized/abandoned-crate/abandoned-crate-named-nodes.bin +0 -0
  230. package/frontiers-rpg-game/assets/models/forageables/.optimized/abandoned-crate/abandoned-crate-named-nodes.gltf +724 -0
  231. package/frontiers-rpg-game/assets/models/forageables/.optimized/abandoned-crate/abandoned-crate.bin +0 -0
  232. package/frontiers-rpg-game/assets/models/forageables/.optimized/abandoned-crate/abandoned-crate.gltf +131 -0
  233. package/frontiers-rpg-game/assets/models/forageables/.optimized/abandoned-crate/abandoned-crate.gltf.md5 +1 -0
  234. package/frontiers-rpg-game/assets/models/forageables/.optimized/abandoned-crate/baseColor.png +0 -0
  235. package/frontiers-rpg-game/assets/models/forageables/.optimized/weathered-stump/baseColor.png +0 -0
  236. package/frontiers-rpg-game/assets/models/forageables/.optimized/weathered-stump/weathered-stump-named-nodes.bin +0 -0
  237. package/frontiers-rpg-game/assets/models/forageables/.optimized/weathered-stump/weathered-stump-named-nodes.gltf +521 -0
  238. package/frontiers-rpg-game/assets/models/forageables/.optimized/weathered-stump/weathered-stump.bin +0 -0
  239. package/frontiers-rpg-game/assets/models/forageables/.optimized/weathered-stump/weathered-stump.gltf +136 -0
  240. package/frontiers-rpg-game/assets/models/forageables/.optimized/weathered-stump/weathered-stump.gltf.md5 +1 -0
  241. package/frontiers-rpg-game/assets/models/forageables/abandoned-crate.gltf +1 -0
  242. package/frontiers-rpg-game/assets/models/forageables/weathered-stump.gltf +1 -0
  243. package/frontiers-rpg-game/assets/models/mounts/.optimized/woolran/baseColor.png +0 -0
  244. package/frontiers-rpg-game/assets/models/mounts/.optimized/woolran/woolran-named-nodes.bin +0 -0
  245. package/frontiers-rpg-game/assets/models/mounts/.optimized/woolran/woolran-named-nodes.gltf +6889 -0
  246. package/frontiers-rpg-game/assets/models/mounts/.optimized/woolran/woolran.bin +0 -0
  247. package/frontiers-rpg-game/assets/models/mounts/.optimized/woolran/woolran.gltf +4486 -0
  248. package/frontiers-rpg-game/assets/models/mounts/.optimized/woolran/woolran.gltf.md5 +1 -0
  249. package/frontiers-rpg-game/assets/models/mounts/woolran.gltf +1 -0
  250. package/frontiers-rpg-game/assets/models/npcs/.optimized/gravekeeper/baseColor.png +0 -0
  251. package/frontiers-rpg-game/assets/models/npcs/.optimized/gravekeeper/gravekeeper-named-nodes.bin +0 -0
  252. package/frontiers-rpg-game/assets/models/npcs/.optimized/gravekeeper/gravekeeper-named-nodes.gltf +3049 -0
  253. package/frontiers-rpg-game/assets/models/npcs/.optimized/gravekeeper/gravekeeper.bin +0 -0
  254. package/frontiers-rpg-game/assets/models/npcs/.optimized/gravekeeper/gravekeeper.gltf +1647 -0
  255. package/frontiers-rpg-game/assets/models/npcs/.optimized/gravekeeper/gravekeeper.gltf.md5 +1 -0
  256. package/frontiers-rpg-game/assets/models/npcs/.optimized/herder/baseColor.png +0 -0
  257. package/frontiers-rpg-game/assets/models/npcs/.optimized/herder/herder-named-nodes.bin +0 -0
  258. package/frontiers-rpg-game/assets/models/npcs/.optimized/herder/herder-named-nodes.gltf +3259 -0
  259. package/frontiers-rpg-game/assets/models/npcs/.optimized/herder/herder.bin +0 -0
  260. package/frontiers-rpg-game/assets/models/npcs/.optimized/herder/herder.gltf +1615 -0
  261. package/frontiers-rpg-game/assets/models/npcs/.optimized/herder/herder.gltf.md5 +1 -0
  262. package/frontiers-rpg-game/assets/models/players/.optimized/player/player-named-nodes.bin +0 -0
  263. package/frontiers-rpg-game/assets/models/players/.optimized/player/player-named-nodes.gltf +7802 -6249
  264. package/frontiers-rpg-game/assets/models/players/.optimized/player/player.bin +0 -0
  265. package/frontiers-rpg-game/assets/models/players/.optimized/player/player.gltf +7046 -5480
  266. package/frontiers-rpg-game/assets/models/players/.optimized/player/player.gltf.md5 +1 -1
  267. package/frontiers-rpg-game/assets/models/players/player.gltf +1 -1
  268. package/frontiers-rpg-game/assets/models/weapons/.optimized/chieftan-blade/baseColor.png +0 -0
  269. package/frontiers-rpg-game/assets/models/weapons/.optimized/chieftan-blade/chieftan-blade-named-nodes.bin +0 -0
  270. package/frontiers-rpg-game/assets/models/weapons/.optimized/chieftan-blade/chieftan-blade-named-nodes.gltf +726 -0
  271. package/frontiers-rpg-game/assets/models/weapons/.optimized/chieftan-blade/chieftan-blade.bin +0 -0
  272. package/frontiers-rpg-game/assets/models/weapons/.optimized/chieftan-blade/chieftan-blade.gltf +335 -0
  273. package/frontiers-rpg-game/assets/models/weapons/.optimized/chieftan-blade/chieftan-blade.gltf.md5 +1 -0
  274. package/frontiers-rpg-game/assets/models/weapons/chieftan-blade.gltf +1 -0
  275. package/frontiers-rpg-game/assets/particles/dirt.png +0 -0
  276. package/frontiers-rpg-game/assets/ui/index.html +50 -7
  277. package/frontiers-rpg-game/assets/ui/menus/dialogue.html +30 -4
  278. package/frontiers-rpg-game/assets/ui/shared/item-stats.html +1 -1
  279. package/frontiers-rpg-game/assets/ui/shared/item-tooltips.html +19 -2
  280. package/frontiers-rpg-game/src/GameClock.ts +14 -0
  281. package/frontiers-rpg-game/src/GameManager.ts +1 -4
  282. package/frontiers-rpg-game/src/GameRegion.ts +6 -2
  283. package/frontiers-rpg-game/src/entities/BaseCombatEntity.ts +58 -26
  284. package/frontiers-rpg-game/src/entities/BaseEntity.ts +10 -3
  285. package/frontiers-rpg-game/src/entities/enemies/GorkinChieftanEntity.ts +190 -0
  286. package/frontiers-rpg-game/src/entities/enemies/GorkinEnforcerEntity.ts +87 -0
  287. package/frontiers-rpg-game/src/entities/enemies/GorkinGruntEntity.ts +113 -0
  288. package/frontiers-rpg-game/src/entities/enemies/GorkinHunterEntity.ts +90 -0
  289. package/frontiers-rpg-game/src/entities/enemies/GorkinShamanEntity.ts +154 -0
  290. package/frontiers-rpg-game/src/entities/enemies/GorkinSwordsmanEntity.ts +121 -0
  291. package/frontiers-rpg-game/src/entities/enemies/QueenWeaverEntity.ts +8 -0
  292. package/frontiers-rpg-game/src/entities/enemies/RatkinBruteEntity.ts +14 -0
  293. package/frontiers-rpg-game/src/entities/enemies/RatkinRangerEntity.ts +8 -0
  294. package/frontiers-rpg-game/src/entities/enemies/RatkinSpellcasterEntity.ts +8 -0
  295. package/frontiers-rpg-game/src/entities/enemies/RatkinWarriorEntity.ts +12 -0
  296. package/frontiers-rpg-game/src/entities/enemies/ReclusiveWeaverEntity.ts +119 -0
  297. package/frontiers-rpg-game/src/entities/{environmental → enemies}/SpiderWebEntity.ts +14 -8
  298. package/frontiers-rpg-game/src/entities/enemies/TaintedRatkinBruteEntity.ts +6 -0
  299. package/frontiers-rpg-game/src/entities/enemies/TaintedRatkinWarriorEntity.ts +4 -0
  300. package/frontiers-rpg-game/src/entities/enemies/WeaverBroodlingEntity.ts +5 -1
  301. package/frontiers-rpg-game/src/entities/forageables/AbandonedCrateEntity.ts +57 -0
  302. package/frontiers-rpg-game/src/entities/forageables/WeatheredStumpEntity.ts +37 -0
  303. package/frontiers-rpg-game/src/entities/npcs/WoolranEntity.ts +26 -0
  304. package/frontiers-rpg-game/src/items/ItemClasses.ts +45 -1
  305. package/frontiers-rpg-game/src/items/ItemUIDataHelper.ts +3 -1
  306. package/frontiers-rpg-game/src/items/consumables/HealingPotionItem.ts +20 -0
  307. package/frontiers-rpg-game/src/items/materials/GoldIngotItem.ts +11 -0
  308. package/frontiers-rpg-game/src/items/materials/GorkinEarItem.ts +10 -0
  309. package/frontiers-rpg-game/src/items/materials/GorkinEyeItem.ts +10 -0
  310. package/frontiers-rpg-game/src/items/materials/GorkinFootItem.ts +10 -0
  311. package/frontiers-rpg-game/src/items/materials/GorkinHandItem.ts +10 -0
  312. package/frontiers-rpg-game/src/items/materials/GorkinSkullItem.ts +10 -0
  313. package/frontiers-rpg-game/src/items/materials/IronIngotItem.ts +11 -0
  314. package/frontiers-rpg-game/src/items/materials/ShackleItem.ts +10 -0
  315. package/frontiers-rpg-game/src/items/materials/ShatteredSwordItem.ts +10 -0
  316. package/frontiers-rpg-game/src/items/materials/SilverSlabItem.ts +11 -0
  317. package/frontiers-rpg-game/src/items/materials/ToughMonsterHide.ts +10 -0
  318. package/frontiers-rpg-game/src/items/materials/WeaverCarapaceItem.ts +11 -0
  319. package/frontiers-rpg-game/src/items/materials/WeaverEggItem.ts +11 -0
  320. package/frontiers-rpg-game/src/items/materials/WeaverHeartItem.ts +10 -0
  321. package/frontiers-rpg-game/src/items/materials/WeaverSilkItem.ts +10 -0
  322. package/frontiers-rpg-game/src/items/weapons/ChieftanBladeItem.ts +70 -0
  323. package/frontiers-rpg-game/src/items/wearables/IronChestplateItem.ts +15 -0
  324. package/frontiers-rpg-game/src/items/wearables/IronGauntletsItem.ts +14 -0
  325. package/frontiers-rpg-game/src/items/wearables/IronGrievesItem.ts +14 -0
  326. package/frontiers-rpg-game/src/items/wearables/IronHelmetItem.ts +15 -0
  327. package/frontiers-rpg-game/src/items/wearables/IronLeggingsItem.ts +15 -0
  328. package/frontiers-rpg-game/src/quests/QuestClasses.ts +6 -0
  329. package/frontiers-rpg-game/src/quests/main/AncientWisdomQuest.ts +125 -0
  330. package/frontiers-rpg-game/src/quests/main/BlightedHarvestQuest.ts +27 -5
  331. package/frontiers-rpg-game/src/quests/side/SkullTrinketsQuest.ts +202 -0
  332. package/frontiers-rpg-game/src/quests/side/WeaverSquashingQuest.ts +128 -0
  333. package/frontiers-rpg-game/src/regions/chitter-forest/ChitterForestRegion.ts +25 -0
  334. package/frontiers-rpg-game/src/regions/hearthwilds/HearthwildsRegion.ts +175 -4
  335. package/frontiers-rpg-game/src/regions/hearthwilds/npcs/ArchivesBookshelf1Entity.ts +136 -0
  336. package/frontiers-rpg-game/src/regions/hearthwilds/npcs/ArchivesBookshelf2Entity.ts +136 -0
  337. package/frontiers-rpg-game/src/regions/hearthwilds/npcs/GravekeeperArdenEntity.ts +48 -0
  338. package/frontiers-rpg-game/src/regions/hearthwilds/npcs/HerderBorisEntity.ts +61 -0
  339. package/frontiers-rpg-game/src/regions/hearthwilds/npcs/MerchantFonnEntity.ts +62 -0
  340. package/frontiers-rpg-game/src/regions/hearthwilds/npcs/SurvivorMycelEntity.ts +62 -0
  341. package/frontiers-rpg-game/src/regions/ratkin-nest/RatkinNestRegion.ts +3 -0
  342. package/frontiers-rpg-game/src/regions/stalkhaven/npcs/BlacksmithArdenEntity.ts +116 -5
  343. package/frontiers-rpg-game/src/regions/weavers-hollow/WeaversHollowRegion.ts +1 -1
  344. package/frontiers-rpg-game/src/systems/Spawner.ts +9 -1
  345. package/package.json +1 -1
  346. /package/frontiers-rpg-game/assets/models/npcs/{auctioneer.gltf → gravekeeper.gltf} +0 -0
  347. /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
- // this._startRegion = stalkhavenPortRegion;
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
- this._stopMoving = false;
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
- EntityOptions,
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
- } & EntityOptions;
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
- this.faceTowards(interactor.position, 8);
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
+ }