@hytopia.com/examples 1.0.13 → 1.0.16

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 (150) hide show
  1. package/frontiers-rpg-game/assets/blocks/Brown_dirt_with_splatters_of_light_green_grass/+x.png +0 -0
  2. package/frontiers-rpg-game/assets/blocks/Brown_dirt_with_splatters_of_light_green_grass/+y.png +0 -0
  3. package/frontiers-rpg-game/assets/blocks/Brown_dirt_with_splatters_of_light_green_grass/+z.png +0 -0
  4. package/frontiers-rpg-game/assets/blocks/Brown_dirt_with_splatters_of_light_green_grass/-x.png +0 -0
  5. package/frontiers-rpg-game/assets/blocks/Brown_dirt_with_splatters_of_light_green_grass/-y.png +0 -0
  6. package/frontiers-rpg-game/assets/blocks/Brown_dirt_with_splatters_of_light_green_grass/-z.png +0 -0
  7. package/frontiers-rpg-game/assets/maps/hearthwilds.json +245549 -0
  8. package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-1/barrel-wood-1-named-nodes.bin +0 -0
  9. package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-1/barrel-wood-1-named-nodes.gltf +294 -0
  10. package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-1/barrel-wood-1.bin +0 -0
  11. package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-1/barrel-wood-1.gltf +136 -0
  12. package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-1/barrel-wood-1.gltf.md5 +1 -0
  13. package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-1/baseColor.png +0 -0
  14. package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-2/barrel-wood-2-named-nodes.bin +0 -0
  15. package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-2/barrel-wood-2-named-nodes.gltf +410 -0
  16. package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-2/barrel-wood-2.bin +0 -0
  17. package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-2/barrel-wood-2.gltf +142 -0
  18. package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-2/barrel-wood-2.gltf.md5 +1 -0
  19. package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-2/baseColor.png +0 -0
  20. package/frontiers-rpg-game/assets/models/environment/.optimized/bush-berry/baseColor.png +0 -0
  21. package/frontiers-rpg-game/assets/models/environment/.optimized/bush-berry/bush-berry-named-nodes.bin +0 -0
  22. package/frontiers-rpg-game/assets/models/environment/.optimized/bush-berry/bush-berry-named-nodes.gltf +621 -0
  23. package/frontiers-rpg-game/assets/models/environment/.optimized/bush-berry/bush-berry.bin +0 -0
  24. package/frontiers-rpg-game/assets/models/environment/.optimized/bush-berry/bush-berry.gltf +629 -0
  25. package/frontiers-rpg-game/assets/models/environment/.optimized/bush-berry/bush-berry.gltf.md5 +1 -0
  26. package/frontiers-rpg-game/assets/models/environment/.optimized/cat-statue/baseColor.png +0 -0
  27. package/frontiers-rpg-game/assets/models/environment/.optimized/cat-statue/cat-statue-named-nodes.bin +0 -0
  28. package/frontiers-rpg-game/assets/models/environment/.optimized/cat-statue/cat-statue-named-nodes.gltf +889 -0
  29. package/frontiers-rpg-game/assets/models/environment/.optimized/cat-statue/cat-statue.bin +0 -0
  30. package/frontiers-rpg-game/assets/models/environment/.optimized/cat-statue/cat-statue.gltf +136 -0
  31. package/frontiers-rpg-game/assets/models/environment/.optimized/cat-statue/cat-statue.gltf.md5 +1 -0
  32. package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-big/baseColor.png +0 -0
  33. package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-big/dead-tree-big-named-nodes.bin +0 -0
  34. package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-big/dead-tree-big-named-nodes.gltf +5292 -0
  35. package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-big/dead-tree-big.bin +0 -0
  36. package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-big/dead-tree-big.gltf +2623 -0
  37. package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-big/dead-tree-big.gltf.md5 +1 -0
  38. package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-medium/baseColor.png +0 -0
  39. package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-medium/dead-tree-medium-named-nodes.bin +0 -0
  40. package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-medium/dead-tree-medium-named-nodes.gltf +2763 -0
  41. package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-medium/dead-tree-medium.bin +0 -0
  42. package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-medium/dead-tree-medium.gltf +1406 -0
  43. package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-medium/dead-tree-medium.gltf.md5 +1 -0
  44. package/frontiers-rpg-game/assets/models/environment/.optimized/fallen-fruit/baseColor.png +0 -0
  45. package/frontiers-rpg-game/assets/models/environment/.optimized/fallen-fruit/fallen-fruit-named-nodes.bin +0 -0
  46. package/frontiers-rpg-game/assets/models/environment/.optimized/fallen-fruit/fallen-fruit-named-nodes.gltf +544 -0
  47. package/frontiers-rpg-game/assets/models/environment/.optimized/fallen-fruit/fallen-fruit.bin +0 -0
  48. package/frontiers-rpg-game/assets/models/environment/.optimized/fallen-fruit/fallen-fruit.gltf +142 -0
  49. package/frontiers-rpg-game/assets/models/environment/.optimized/fallen-fruit/fallen-fruit.gltf.md5 +1 -0
  50. package/frontiers-rpg-game/assets/models/environment/.optimized/flower-tuft/baseColor.png +0 -0
  51. package/frontiers-rpg-game/assets/models/environment/.optimized/flower-tuft/flower-tuft-named-nodes.bin +0 -0
  52. package/frontiers-rpg-game/assets/models/environment/.optimized/flower-tuft/flower-tuft-named-nodes.gltf +1703 -0
  53. package/frontiers-rpg-game/assets/models/environment/.optimized/flower-tuft/flower-tuft.bin +0 -0
  54. package/frontiers-rpg-game/assets/models/environment/.optimized/flower-tuft/flower-tuft.gltf +766 -0
  55. package/frontiers-rpg-game/assets/models/environment/.optimized/flower-tuft/flower-tuft.gltf.md5 +1 -0
  56. package/frontiers-rpg-game/assets/models/environment/.optimized/flowers-cluster/baseColor.png +0 -0
  57. package/frontiers-rpg-game/assets/models/environment/.optimized/flowers-cluster/flowers-cluster-named-nodes.bin +0 -0
  58. package/frontiers-rpg-game/assets/models/environment/.optimized/flowers-cluster/flowers-cluster-named-nodes.gltf +2354 -0
  59. package/frontiers-rpg-game/assets/models/environment/.optimized/flowers-cluster/flowers-cluster.bin +0 -0
  60. package/frontiers-rpg-game/assets/models/environment/.optimized/flowers-cluster/flowers-cluster.gltf +685 -0
  61. package/frontiers-rpg-game/assets/models/environment/.optimized/flowers-cluster/flowers-cluster.gltf.md5 +1 -0
  62. package/frontiers-rpg-game/assets/models/environment/.optimized/grass-tall/baseColor.png +0 -0
  63. package/frontiers-rpg-game/assets/models/environment/.optimized/grass-tall/grass-tall-named-nodes.bin +0 -0
  64. package/frontiers-rpg-game/assets/models/environment/.optimized/grass-tall/grass-tall-named-nodes.gltf +365 -0
  65. package/frontiers-rpg-game/assets/models/environment/.optimized/grass-tall/grass-tall.bin +0 -0
  66. package/frontiers-rpg-game/assets/models/environment/.optimized/grass-tall/grass-tall.gltf +301 -0
  67. package/frontiers-rpg-game/assets/models/environment/.optimized/grass-tall/grass-tall.gltf.md5 +1 -0
  68. package/frontiers-rpg-game/assets/models/environment/.optimized/grass-wild-clump/baseColor.png +0 -0
  69. package/frontiers-rpg-game/assets/models/environment/.optimized/grass-wild-clump/grass-wild-clump-named-nodes.bin +0 -0
  70. package/frontiers-rpg-game/assets/models/environment/.optimized/grass-wild-clump/grass-wild-clump-named-nodes.gltf +893 -0
  71. package/frontiers-rpg-game/assets/models/environment/.optimized/grass-wild-clump/grass-wild-clump.bin +0 -0
  72. package/frontiers-rpg-game/assets/models/environment/.optimized/grass-wild-clump/grass-wild-clump.gltf +893 -0
  73. package/frontiers-rpg-game/assets/models/environment/.optimized/grass-wild-clump/grass-wild-clump.gltf.md5 +1 -0
  74. package/frontiers-rpg-game/assets/models/environment/.optimized/mushroom-red-multiple/baseColor.png +0 -0
  75. package/frontiers-rpg-game/assets/models/environment/.optimized/mushroom-red-multiple/mushroom-red-multiple-named-nodes.bin +0 -0
  76. package/frontiers-rpg-game/assets/models/environment/.optimized/mushroom-red-multiple/mushroom-red-multiple-named-nodes.gltf +260 -0
  77. package/frontiers-rpg-game/assets/models/environment/.optimized/mushroom-red-multiple/mushroom-red-multiple.bin +0 -0
  78. package/frontiers-rpg-game/assets/models/environment/.optimized/mushroom-red-multiple/mushroom-red-multiple.gltf +136 -0
  79. package/frontiers-rpg-game/assets/models/environment/.optimized/mushroom-red-multiple/mushroom-red-multiple.gltf.md5 +1 -0
  80. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-stairs/baseColor.png +0 -0
  81. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-stairs/oak-stairs.gltf.md5 +1 -1
  82. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-big/baseColor.png +0 -0
  83. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-big/oak-tree-big-named-nodes.bin +0 -0
  84. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-big/oak-tree-big-named-nodes.gltf +3299 -0
  85. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-big/oak-tree-big.bin +0 -0
  86. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-big/oak-tree-big.gltf +1359 -0
  87. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-big/oak-tree-big.gltf.md5 +1 -0
  88. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-medium/baseColor.png +0 -0
  89. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-medium/oak-tree-medium-named-nodes.bin +0 -0
  90. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-medium/oak-tree-medium-named-nodes.gltf +7187 -0
  91. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-medium/oak-tree-medium.bin +0 -0
  92. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-medium/oak-tree-medium.gltf +1897 -0
  93. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-medium/oak-tree-medium.gltf.md5 +1 -0
  94. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-small/baseColor.png +0 -0
  95. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-small/oak-tree-small-named-nodes.bin +0 -0
  96. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-small/oak-tree-small-named-nodes.gltf +3455 -0
  97. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-small/oak-tree-small.bin +0 -0
  98. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-small/oak-tree-small.gltf +765 -0
  99. package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-small/oak-tree-small.gltf.md5 +1 -0
  100. package/frontiers-rpg-game/assets/models/environment/.optimized/redcap-mushroom-group/baseColor.png +0 -0
  101. package/frontiers-rpg-game/assets/models/environment/.optimized/redcap-mushroom-group/redcap-mushroom-group-named-nodes.bin +0 -0
  102. package/frontiers-rpg-game/assets/models/environment/.optimized/redcap-mushroom-group/redcap-mushroom-group-named-nodes.gltf +487 -0
  103. package/frontiers-rpg-game/assets/models/environment/.optimized/redcap-mushroom-group/redcap-mushroom-group.bin +0 -0
  104. package/frontiers-rpg-game/assets/models/environment/.optimized/redcap-mushroom-group/redcap-mushroom-group.gltf +136 -0
  105. package/frontiers-rpg-game/assets/models/environment/.optimized/redcap-mushroom-group/redcap-mushroom-group.gltf.md5 +1 -0
  106. package/frontiers-rpg-game/assets/models/environment/.optimized/scattered-pebbles/baseColor.png +0 -0
  107. package/frontiers-rpg-game/assets/models/environment/.optimized/scattered-pebbles/scattered-pebbles-named-nodes.bin +0 -0
  108. package/frontiers-rpg-game/assets/models/environment/.optimized/scattered-pebbles/scattered-pebbles-named-nodes.gltf +356 -0
  109. package/frontiers-rpg-game/assets/models/environment/.optimized/scattered-pebbles/scattered-pebbles.bin +0 -0
  110. package/frontiers-rpg-game/assets/models/environment/.optimized/scattered-pebbles/scattered-pebbles.gltf +136 -0
  111. package/frontiers-rpg-game/assets/models/environment/.optimized/scattered-pebbles/scattered-pebbles.gltf.md5 +1 -0
  112. package/frontiers-rpg-game/assets/models/environment/.optimized/shell-starfish-group/baseColor.png +0 -0
  113. package/frontiers-rpg-game/assets/models/environment/.optimized/shell-starfish-group/shell-starfish-group-named-nodes.bin +0 -0
  114. package/frontiers-rpg-game/assets/models/environment/.optimized/shell-starfish-group/shell-starfish-group-named-nodes.gltf +772 -0
  115. package/frontiers-rpg-game/assets/models/environment/.optimized/shell-starfish-group/shell-starfish-group.bin +0 -0
  116. package/frontiers-rpg-game/assets/models/environment/.optimized/shell-starfish-group/shell-starfish-group.gltf +142 -0
  117. package/frontiers-rpg-game/assets/models/environment/.optimized/shell-starfish-group/shell-starfish-group.gltf.md5 +1 -0
  118. package/frontiers-rpg-game/assets/models/environment/barrel-wood-1.gltf +1 -0
  119. package/frontiers-rpg-game/assets/models/environment/barrel-wood-2.gltf +1 -0
  120. package/frontiers-rpg-game/assets/models/environment/bush-berry.gltf +1 -0
  121. package/frontiers-rpg-game/assets/models/environment/cat-statue.gltf +1 -0
  122. package/frontiers-rpg-game/assets/models/environment/dead-tree-big.gltf +1 -0
  123. package/frontiers-rpg-game/assets/models/environment/dead-tree-medium.gltf +1 -0
  124. package/frontiers-rpg-game/assets/models/environment/fallen-fruit.gltf +1 -0
  125. package/frontiers-rpg-game/assets/models/environment/flower-tuft.gltf +1 -0
  126. package/frontiers-rpg-game/assets/models/environment/flowers-cluster.gltf +1 -0
  127. package/frontiers-rpg-game/assets/models/environment/grass-tall.gltf +1 -0
  128. package/frontiers-rpg-game/assets/models/environment/grass-wild-clump.gltf +1 -0
  129. package/frontiers-rpg-game/assets/models/environment/mushroom-red-multiple.gltf +1 -0
  130. package/frontiers-rpg-game/assets/models/environment/oak-stairs.gltf +1 -1
  131. package/frontiers-rpg-game/assets/models/environment/oak-tree-big.gltf +1 -0
  132. package/frontiers-rpg-game/assets/models/environment/oak-tree-medium.gltf +1 -0
  133. package/frontiers-rpg-game/assets/models/environment/oak-tree-small.gltf +1 -0
  134. package/frontiers-rpg-game/assets/models/environment/redcap-mushroom-group.gltf +1 -0
  135. package/frontiers-rpg-game/assets/models/environment/scattered-pebbles.gltf +1 -0
  136. package/frontiers-rpg-game/assets/models/environment/shell-starfish-group.gltf +1 -0
  137. package/frontiers-rpg-game/assets/ui/index.html +16 -11
  138. package/frontiers-rpg-game/assets/ui/menus/quests.html +4 -3
  139. package/frontiers-rpg-game/assets/ui/scene-ui-templates/entity-nameplate.html +12 -8
  140. package/frontiers-rpg-game/src/GameClock.ts +13 -3
  141. package/frontiers-rpg-game/src/GameManager.ts +6 -0
  142. package/frontiers-rpg-game/src/GamePlayer.ts +4 -0
  143. package/frontiers-rpg-game/src/GameRegion.ts +17 -2
  144. package/frontiers-rpg-game/src/entities/BaseEntity.ts +6 -0
  145. package/frontiers-rpg-game/src/entities/enemies/QueenWeaverEntity.ts +1 -0
  146. package/frontiers-rpg-game/src/items/BaseWeaponItem.ts +2 -2
  147. package/frontiers-rpg-game/src/regions/hearthwilds/HearthwildsRegion.ts +25 -0
  148. package/frontiers-rpg-game/src/regions/stalkhaven/StalkhavenRegion.ts +33 -22
  149. package/package.json +1 -1
  150. package/frontiers-rpg-game/dev/persistence/player-player-1.json +0 -140
@@ -129,6 +129,16 @@
129
129
  else if (healthPercent > 0.33) healthBarFill.classList.add('health-medium');
130
130
  else healthBarFill.classList.add('health-low');
131
131
  }
132
+
133
+ if (state.type) {
134
+ // Remove any existing type classes
135
+ nameplate.classList.remove('boss');
136
+
137
+ // Apply boss class if entity type is boss
138
+ if (state.type === 'boss') {
139
+ nameplate.classList.add('boss');
140
+ }
141
+ }
132
142
  });
133
143
 
134
144
  function showDamageNumber(amount, type) {
@@ -337,13 +347,7 @@
337
347
  .entity-nameplate-health-bar-fill.health-medium { background-color: #FFC107; }
338
348
  .entity-nameplate-health-bar-fill.health-low { background-color: #f44336; }
339
349
 
340
- .entity-nameplate.elite .entity-nameplate-name {
341
- font-size: 12px;
342
- font-weight: 700;
343
- background: linear-gradient(45deg, #ffd700, #ffed4e);
344
- -webkit-background-clip: text;
345
- -webkit-text-fill-color: transparent;
346
- background-clip: text;
347
- filter: drop-shadow(0 0 8px rgba(255,215,0,0.5)) drop-shadow(0 1px 3px rgba(0,0,0,0.9));
350
+ .entity-nameplate.boss .entity-nameplate-name {
351
+ color: #ef4444;
348
352
  }
349
353
  </style>
@@ -1,6 +1,6 @@
1
1
  import type GameRegion from './GameRegion';
2
2
 
3
- const CYCLE_CLOCK_INTERVAL_MS = 5000; // Update clock every 1 second
3
+ const CYCLE_CLOCK_INTERVAL_MS = 5000; // Update clock every 5 second
4
4
  const CYCLE_CLOCK_OFFSET_HOURS = 7;
5
5
  const CYCLE_DAY_MAX_SKYBOX_INTENSITY = 1.2;
6
6
  const CYCLE_DURATION_MS = 24 * 60 * 1000; // Day/Night Cycle Every 24 minutes
@@ -49,9 +49,19 @@ export default class GameClock {
49
49
  private _updateRegionClockCycle(region: GameRegion): void {
50
50
  const world = region.world;
51
51
 
52
- // Calculate sun position in circular path
52
+ // Calculate sun position with asymmetric day/night cycle (75% day, 25% night)
53
53
  const timeProgress = this._timeMs / CYCLE_DURATION_MS;
54
- const sunAngle = timeProgress * 2 * Math.PI;
54
+
55
+ // Create asymmetric sun angle: 75% of time for day, 25% for night
56
+ let sunAngle: number;
57
+ if (timeProgress < 0.75) {
58
+ // Day period: map first 75% of cycle to first half of sine wave (0 to π)
59
+ sunAngle = (timeProgress / 0.75) * Math.PI;
60
+ } else {
61
+ // Night period: map last 25% of cycle to second half of sine wave (π to 2π)
62
+ sunAngle = Math.PI + ((timeProgress - 0.75) / 0.25) * Math.PI;
63
+ }
64
+
55
65
  const sunRadius = 300;
56
66
  const sunHeight = 100 + Math.sin(sunAngle) * 150;
57
67
 
@@ -7,6 +7,7 @@ import type GameRegion from './GameRegion';
7
7
 
8
8
  // Regions
9
9
  import ChitterForestRegion from './regions/chitter-forest/ChitterForestRegion';
10
+ import HearthwildsRegion from './regions/hearthwilds/HearthwildsRegion';
10
11
  import RatkinNestRegion from './regions/ratkin-nest/RatkinNestRegion';
11
12
  import StalkhavenRegion from './regions/stalkhaven/StalkhavenRegion';
12
13
  import StalkhavenPortRegion from './regions/stalkhaven-port/StalkhavenPortRegion';
@@ -46,6 +47,11 @@ export default class GameManager {
46
47
  this._regions.set(chitterForestRegion.id, chitterForestRegion);
47
48
  GameClock.instance.addRegionClockCycle(chitterForestRegion);
48
49
 
50
+ // Hearthwilds
51
+ // const hearthwildsRegion = new HearthwildsRegion();
52
+ // this._regions.set(hearthwildsRegion.id, hearthwildsRegion);
53
+ // GameClock.instance.addRegionClockCycle(hearthwildsRegion);
54
+
49
55
  // Ratkin Nest
50
56
  const ratkinNestRegion = new RatkinNestRegion();
51
57
  this._regions.set(ratkinNestRegion.id, ratkinNestRegion);
@@ -359,6 +359,10 @@ export default class GamePlayer {
359
359
  this._spawnHeldItem();
360
360
  }
361
361
 
362
+ public onPlayerReconnected(): void {
363
+ this._loadUI();
364
+ }
365
+
362
366
  public removeEntityAlert(entityClass: typeof BaseEntity): void {
363
367
  if (!this._entityAlertClassNames.has(entityClass.name)) return;
364
368
 
@@ -19,8 +19,8 @@ import GamePlayerEntity from './GamePlayerEntity';
19
19
 
20
20
  const DEFAULT_MAX_AMBIENT_LIGHT_INTENSITY = 1.5;
21
21
  const DEFAULT_MAX_DIRECTIONAL_LIGHT_INTENSITY = 3.25;
22
- const DEFAULT_MIN_AMBIENT_LIGHT_INTENSITY = 0.4;
23
- const DEFAULT_MIN_DIRECTIONAL_LIGHT_INTENSITY = 0.3;
22
+ const DEFAULT_MIN_AMBIENT_LIGHT_INTENSITY = 0.5;
23
+ const DEFAULT_MIN_DIRECTIONAL_LIGHT_INTENSITY = 0.4;
24
24
 
25
25
  export enum GameRegionPlayerEvent {
26
26
  REACHED = 'GameRegion.REACHED',
@@ -86,6 +86,7 @@ export default class GameRegion {
86
86
  this._world.stop(); // Keep it in stopped state, when a player joins the world, we'll start it.
87
87
  this._world.on(PlayerEvent.JOINED_WORLD, ({ player }) => this.onPlayerJoin(player));
88
88
  this._world.on(PlayerEvent.LEFT_WORLD, ({ player }) => this.onPlayerLeave(player));
89
+ this._world.on(PlayerEvent.RECONNECTED_WORLD, ({ player }) => this.onPlayerReconnected(player));
89
90
 
90
91
  // temp
91
92
  // this._world.simulation.enableDebugRendering(true);
@@ -140,6 +141,7 @@ export default class GameRegion {
140
141
  }
141
142
 
142
143
  protected async onPlayerJoin(player: Player) {
144
+ console.log('onPlayerJoin', this.name);
143
145
  const gamePlayer = await GamePlayer.getOrCreate(player);
144
146
 
145
147
  // Set the current region for the player
@@ -189,4 +191,17 @@ export default class GameRegion {
189
191
  this._world.stop();
190
192
  }
191
193
  }
194
+
195
+ // The RECONNECTED_WORLD even is only emitted by the engine when the player disconnects and
196
+ // reconnects to the game with a known connectionId before the close connection timeout finishes
197
+ // which gives them 5 second window to reconnect after disconnecting. This event will fire such
198
+ // as if a player unintentionally refreshes the page, if their browser crashes but restarts quickly
199
+ // with the same connectionId in the URL, etc.
200
+ // The HYTOPIA SDK handles resynchronization of all persisted state back to the player client such as
201
+ // their entity, scene ui states, etc, but anything that uses ephemeral state (Such as UI) we need
202
+ // to handle reloading for them manually here.
203
+ protected async onPlayerReconnected(player: Player) {
204
+ const gamePlayer = await GamePlayer.getOrCreate(player);
205
+ gamePlayer.onPlayerReconnected();
206
+ }
192
207
  }
@@ -56,6 +56,8 @@ export type BaseEntityItemDrop = {
56
56
  quantity?: number;
57
57
  }
58
58
 
59
+ export type BaseEntityNameplateType = 'normal' | 'boss';
60
+
59
61
  export type BaseEntityOptions = {
60
62
  combatExperienceReward?: number;
61
63
  controller?: PathfindingEntityController;
@@ -75,6 +77,7 @@ export type BaseEntityOptions = {
75
77
  moveAnimationSpeed?: number;
76
78
  moveOptions?: MoveOptions;
77
79
  moveSpeed?: number;
80
+ nameplateType?: BaseEntityNameplateType;
78
81
  nameplateViewDistnace?: number;
79
82
  pathfindingOptions?: PathfindingOptions;
80
83
  pushable?: boolean;
@@ -103,6 +106,7 @@ export default class BaseEntity extends Entity implements IInteractable, IDamage
103
106
  private _moveOptions: MoveOptions | undefined;
104
107
  private _moveSpeed: number;
105
108
  private _nameplateSceneUI: SceneUI;
109
+ private _nameplateType: BaseEntityNameplateType | undefined;
106
110
  private _nameplateViewDistance: number | undefined;
107
111
  private _optionMap: Map<number, BaseEntityDialogueOption> = new Map();
108
112
  private _pathfindingOptions: PathfindingOptions | undefined;
@@ -135,6 +139,7 @@ export default class BaseEntity extends Entity implements IInteractable, IDamage
135
139
  this._moveOptions = options.moveOptions;
136
140
  this._moveSpeed = options.moveSpeed ?? 2;
137
141
  this._faceSpeed = options.faceSpeed ?? this._moveSpeed * 2;
142
+ this._nameplateType = options.nameplateType;
138
143
  this._nameplateViewDistance = options.nameplateViewDistnace;
139
144
  this._pathfindingOptions = options.pathfindingOptions;
140
145
  this._pushable = options.pushable ?? false;
@@ -367,6 +372,7 @@ export default class BaseEntity extends Entity implements IInteractable, IDamage
367
372
  interactable: this.isInteractable,
368
373
  interactActionText: this.interactActionText,
369
374
  maxHealth: this.maxHealth,
375
+ type: this._nameplateType,
370
376
  },
371
377
  });
372
378
  }
@@ -67,6 +67,7 @@ export default class QueenWeaverEntity extends BaseCombatEntity {
67
67
  faceSpeed: 4,
68
68
  health: 1000,
69
69
  idleAnimations: [ 'waiting' ],
70
+ nameplateType: 'boss',
70
71
  modelUri: 'models/enemies/weaver.gltf',
71
72
  modelScale: 1.3,
72
73
  moveAnimations: [ 'walking' ],
@@ -124,14 +124,14 @@ export default abstract class BaseWeaponItem extends BaseItem {
124
124
  attack.reach,
125
125
  );
126
126
 
127
- if (target && !(target instanceof GamePlayerEntity)) { // change this for PVP support later.
127
+ if (target) {
128
128
  const damage = this.calculateDamageWithVariance(attack.damage, attack.damageVariance);
129
129
  this.dealDamage(target, damage, attackDirection, attack.knockbackForce);
130
130
  }
131
131
  }
132
132
 
133
133
  protected dealDamage(target: Entity, damage: number, knockbackDirection: Vector3Like, knockbackForce?: number): void {
134
- if (!isDamageable(target)) {
134
+ if (!isDamageable(target) || target instanceof GamePlayerEntity) { // disabled instanceof for pvp support later.
135
135
  return;
136
136
  }
137
137
 
@@ -0,0 +1,25 @@
1
+ import { Quaternion } from 'hytopia';
2
+ import GameRegion from '../../GameRegion';
3
+ import Spawner from '../../systems/Spawner';
4
+ import PortalEntity from '../../entities/PortalEntity';
5
+ import type { WanderOptions } from '../../entities/BaseEntity';
6
+
7
+ import hearthwildsMap from '../../../assets/maps/hearthwilds.json';
8
+
9
+ export default class HearthwildsRegion extends GameRegion {
10
+ public constructor() {
11
+ super({
12
+ id: 'hearthwilds',
13
+ name: 'Hearthwilds',
14
+ map: hearthwildsMap,
15
+ skyboxUri: 'skyboxes/partly-cloudy',
16
+ spawnPoint: { x: 200, y: 15, z: -75 },
17
+ ambientAudioUri: 'audio/music/jungle-theme-looping.mp3',
18
+ });
19
+ }
20
+
21
+ protected override setup(): void {
22
+ super.setup();
23
+
24
+ }
25
+ }
@@ -1,7 +1,10 @@
1
1
  import { Quaternion } from 'hytopia';
2
2
  import GameRegion from '../../GameRegion';
3
+ import Spawner from '../../systems/Spawner';
3
4
  import PortalEntity from '../../entities/PortalEntity';
5
+ import type { WanderOptions } from '../../entities/BaseEntity';
4
6
 
7
+ // NPCs
5
8
  import CapfolkVillagerEntity from '../../entities/npcs/CapfolkVillagerEntity';
6
9
  import CaptainSpornEntity from './npcs/CaptainSpornEntity';
7
10
  import CommanderMarkEntity from './npcs/CommanderMarkEntity';
@@ -28,6 +31,7 @@ export default class StalkhavenRegion extends GameRegion {
28
31
  super.setup();
29
32
 
30
33
  this._setupNPCs();
34
+ this._setupNPCSpawners();
31
35
  this._setupPortals();
32
36
  }
33
37
 
@@ -38,31 +42,38 @@ export default class StalkhavenRegion extends GameRegion {
38
42
  (new CommanderMarkEntity({ facingAngle: 180 })).spawn(this.world, { x: 3, y: 3, z: 12 });
39
43
  (new HealerMycelisEntity({ facingAngle: 180 })).spawn(this.world, { x: -13.5, y: 3, z: -30 });
40
44
  (new MerchantFinnEntity({ facingAngle: 90 })).spawn(this.world, { x: 13, y: 3, z: 26.5 });
45
+ }
41
46
 
42
- // Wandering Villagers
43
- const villagerStartPositions = [
44
- { x: -6, y: 3, z: 13 }, // town center
45
- { x: 14, y: 3, z: 4 }, // town center
46
- { x: -2, y: 3, z: -15 }, // town center
47
- { x: 23, y: 3, z: 41 }, // well
48
- { x: 26, y: 3, z: -22 }, // market
49
- { x: 15, y: 3, z: -30 }, // market
50
- ];
47
+ private _setupNPCSpawners(): void {
48
+ const wanderOptions: WanderOptions = {
49
+ idleMinMs: 5000,
50
+ idleMaxMs: 15000,
51
+ maxWanderRadius: 12,
52
+ moveOptions: {
53
+ moveCompletesWhenStuck: true,
54
+ moveStoppingDistance: 1,
55
+ }
56
+ }
51
57
 
52
- for (const position of villagerStartPositions) {
53
- const villager = new CapfolkVillagerEntity({ facingAngle: Math.random() * 360 });
54
- villager.spawn(this.world, position);
55
- villager.wander(villager.moveSpeed, {
56
- idleMinMs: 5000,
57
- idleMaxMs: 15000,
58
- maxWanderRadius: 12,
59
- moveOptions: {
60
- moveCompletesWhenStuck: true,
61
- moveStoppingDistance: 1,
58
+ const capfolkVillagerSpawner = new Spawner({
59
+ groundCheckDistance: 10,
60
+ maxSpawns: 10,
61
+ spawnables: [
62
+ { entityConstructor: CapfolkVillagerEntity, weight: 1, wanders: true, wanderOptions },
63
+ ],
64
+ spawnRegions: [
65
+ {
66
+ min: { x: -24, y: 2, z: -29 },
67
+ max: { x: 29, y: 12, z: 38 },
68
+ weight: 1,
62
69
  }
63
- });
64
- }
65
- }
70
+ ],
71
+ spawnIntervalMs: 60000,
72
+ world: this.world,
73
+ });
74
+
75
+ capfolkVillagerSpawner.start(true);
76
+ }
66
77
 
67
78
  private _setupPortals(): void {
68
79
  const chitterForestPortal = new PortalEntity({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hytopia.com/examples",
3
- "version": "1.0.13",
3
+ "version": "1.0.16",
4
4
  "description": "",
5
5
  "license": "ISC",
6
6
  "author": "",
@@ -1,140 +0,0 @@
1
- {
2
- "health": 130,
3
- "currentRegionId": "stalkhaven",
4
- "skillExperience": [
5
- [
6
- "exploration",
7
- 375
8
- ],
9
- [
10
- "agility",
11
- 79
12
- ],
13
- [
14
- "combat",
15
- 320
16
- ],
17
- [
18
- "foraging",
19
- 8
20
- ]
21
- ],
22
- "backpack": {
23
- "items": [
24
- {
25
- "position": 0,
26
- "itemId": "common_mushroom",
27
- "quantity": 3
28
- },
29
- {
30
- "position": 1,
31
- "itemId": "ratkin_tooth",
32
- "quantity": 3
33
- }
34
- ]
35
- },
36
- "hotbar": {
37
- "items": [
38
- {
39
- "position": 0,
40
- "itemId": "dull_sword"
41
- },
42
- {
43
- "position": 2,
44
- "itemId": "toy_sword"
45
- },
46
- {
47
- "position": 3,
48
- "itemId": "gold",
49
- "quantity": 147
50
- },
51
- {
52
- "position": 1,
53
- "itemId": "raw_hide",
54
- "quantity": 2
55
- },
56
- {
57
- "position": 4,
58
- "itemId": "ratkin_eyes"
59
- },
60
- {
61
- "position": 5,
62
- "itemId": "ratkin_tail",
63
- "quantity": 2
64
- },
65
- {
66
- "position": 6,
67
- "itemId": "ratkin_bones",
68
- "quantity": 3
69
- },
70
- {
71
- "position": 7,
72
- "itemId": "common_seeds",
73
- "quantity": 4
74
- }
75
- ]
76
- },
77
- "questLog": {
78
- "quests": [
79
- {
80
- "questId": "welcome-to-stalkhaven",
81
- "state": "completed",
82
- "objectiveProgress": {
83
- "talk-to-mark": 1
84
- }
85
- },
86
- {
87
- "questId": "exploring-stalkhaven",
88
- "state": "completed",
89
- "objectiveProgress": {
90
- "talk-to-mycelis": 1,
91
- "talk-to-finn": 1,
92
- "talk-to-sporn": 1,
93
- "talk-to-mark": 1
94
- }
95
- },
96
- {
97
- "questId": "tested-mettle",
98
- "state": "completed",
99
- "objectiveProgress": {
100
- "kill-5-ratkin": 5,
101
- "dodge-3-times": 3,
102
- "talk-to-mark": 1
103
- }
104
- },
105
- {
106
- "questId": "hammers-and-crafting",
107
- "state": "active",
108
- "objectiveProgress": {
109
- "gather-materials": 2,
110
- "craft-item": 0,
111
- "talk-to-arden": 0
112
- }
113
- },
114
- {
115
- "questId": "stalkhavens-outpost",
116
- "state": "active",
117
- "objectiveProgress": {
118
- "talk-to-chanterelion": 0
119
- }
120
- }
121
- ]
122
- },
123
- "storage": {
124
- "items": []
125
- },
126
- "wearables": {
127
- "items": [
128
- {
129
- "position": 1,
130
- "itemId": "adventurer_tunic"
131
- }
132
- ]
133
- },
134
- "currentRegionSpawnFacingAngle": 0,
135
- "currentRegionSpawnPoint": {
136
- "x": 1,
137
- "y": 2,
138
- "z": 40
139
- }
140
- }