@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.
- package/frontiers-rpg-game/assets/blocks/Brown_dirt_with_splatters_of_light_green_grass/+x.png +0 -0
- package/frontiers-rpg-game/assets/blocks/Brown_dirt_with_splatters_of_light_green_grass/+y.png +0 -0
- package/frontiers-rpg-game/assets/blocks/Brown_dirt_with_splatters_of_light_green_grass/+z.png +0 -0
- package/frontiers-rpg-game/assets/blocks/Brown_dirt_with_splatters_of_light_green_grass/-x.png +0 -0
- package/frontiers-rpg-game/assets/blocks/Brown_dirt_with_splatters_of_light_green_grass/-y.png +0 -0
- package/frontiers-rpg-game/assets/blocks/Brown_dirt_with_splatters_of_light_green_grass/-z.png +0 -0
- package/frontiers-rpg-game/assets/maps/hearthwilds.json +245549 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-1/barrel-wood-1-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-1/barrel-wood-1-named-nodes.gltf +294 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-1/barrel-wood-1.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-1/barrel-wood-1.gltf +136 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-1/barrel-wood-1.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-1/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-2/barrel-wood-2-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-2/barrel-wood-2-named-nodes.gltf +410 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-2/barrel-wood-2.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-2/barrel-wood-2.gltf +142 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-2/barrel-wood-2.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/barrel-wood-2/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/bush-berry/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/bush-berry/bush-berry-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/bush-berry/bush-berry-named-nodes.gltf +621 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/bush-berry/bush-berry.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/bush-berry/bush-berry.gltf +629 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/bush-berry/bush-berry.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/cat-statue/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/cat-statue/cat-statue-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/cat-statue/cat-statue-named-nodes.gltf +889 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/cat-statue/cat-statue.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/cat-statue/cat-statue.gltf +136 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/cat-statue/cat-statue.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-big/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-big/dead-tree-big-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-big/dead-tree-big-named-nodes.gltf +5292 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-big/dead-tree-big.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-big/dead-tree-big.gltf +2623 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-big/dead-tree-big.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-medium/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-medium/dead-tree-medium-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-medium/dead-tree-medium-named-nodes.gltf +2763 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-medium/dead-tree-medium.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-medium/dead-tree-medium.gltf +1406 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/dead-tree-medium/dead-tree-medium.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/fallen-fruit/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/fallen-fruit/fallen-fruit-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/fallen-fruit/fallen-fruit-named-nodes.gltf +544 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/fallen-fruit/fallen-fruit.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/fallen-fruit/fallen-fruit.gltf +142 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/fallen-fruit/fallen-fruit.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/flower-tuft/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/flower-tuft/flower-tuft-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/flower-tuft/flower-tuft-named-nodes.gltf +1703 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/flower-tuft/flower-tuft.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/flower-tuft/flower-tuft.gltf +766 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/flower-tuft/flower-tuft.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/flowers-cluster/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/flowers-cluster/flowers-cluster-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/flowers-cluster/flowers-cluster-named-nodes.gltf +2354 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/flowers-cluster/flowers-cluster.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/flowers-cluster/flowers-cluster.gltf +685 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/flowers-cluster/flowers-cluster.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/grass-tall/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/grass-tall/grass-tall-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/grass-tall/grass-tall-named-nodes.gltf +365 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/grass-tall/grass-tall.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/grass-tall/grass-tall.gltf +301 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/grass-tall/grass-tall.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/grass-wild-clump/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/grass-wild-clump/grass-wild-clump-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/grass-wild-clump/grass-wild-clump-named-nodes.gltf +893 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/grass-wild-clump/grass-wild-clump.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/grass-wild-clump/grass-wild-clump.gltf +893 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/grass-wild-clump/grass-wild-clump.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/mushroom-red-multiple/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/mushroom-red-multiple/mushroom-red-multiple-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/mushroom-red-multiple/mushroom-red-multiple-named-nodes.gltf +260 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/mushroom-red-multiple/mushroom-red-multiple.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/mushroom-red-multiple/mushroom-red-multiple.gltf +136 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/mushroom-red-multiple/mushroom-red-multiple.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-stairs/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-stairs/oak-stairs.gltf.md5 +1 -1
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-big/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-big/oak-tree-big-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-big/oak-tree-big-named-nodes.gltf +3299 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-big/oak-tree-big.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-big/oak-tree-big.gltf +1359 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-big/oak-tree-big.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-medium/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-medium/oak-tree-medium-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-medium/oak-tree-medium-named-nodes.gltf +7187 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-medium/oak-tree-medium.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-medium/oak-tree-medium.gltf +1897 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-medium/oak-tree-medium.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-small/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-small/oak-tree-small-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-small/oak-tree-small-named-nodes.gltf +3455 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-small/oak-tree-small.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-small/oak-tree-small.gltf +765 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/oak-tree-small/oak-tree-small.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/redcap-mushroom-group/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/redcap-mushroom-group/redcap-mushroom-group-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/redcap-mushroom-group/redcap-mushroom-group-named-nodes.gltf +487 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/redcap-mushroom-group/redcap-mushroom-group.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/redcap-mushroom-group/redcap-mushroom-group.gltf +136 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/redcap-mushroom-group/redcap-mushroom-group.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/scattered-pebbles/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/scattered-pebbles/scattered-pebbles-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/scattered-pebbles/scattered-pebbles-named-nodes.gltf +356 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/scattered-pebbles/scattered-pebbles.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/scattered-pebbles/scattered-pebbles.gltf +136 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/scattered-pebbles/scattered-pebbles.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/shell-starfish-group/baseColor.png +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/shell-starfish-group/shell-starfish-group-named-nodes.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/shell-starfish-group/shell-starfish-group-named-nodes.gltf +772 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/shell-starfish-group/shell-starfish-group.bin +0 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/shell-starfish-group/shell-starfish-group.gltf +142 -0
- package/frontiers-rpg-game/assets/models/environment/.optimized/shell-starfish-group/shell-starfish-group.gltf.md5 +1 -0
- package/frontiers-rpg-game/assets/models/environment/barrel-wood-1.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/barrel-wood-2.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/bush-berry.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/cat-statue.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/dead-tree-big.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/dead-tree-medium.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/fallen-fruit.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/flower-tuft.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/flowers-cluster.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/grass-tall.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/grass-wild-clump.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/mushroom-red-multiple.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/oak-stairs.gltf +1 -1
- package/frontiers-rpg-game/assets/models/environment/oak-tree-big.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/oak-tree-medium.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/oak-tree-small.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/redcap-mushroom-group.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/scattered-pebbles.gltf +1 -0
- package/frontiers-rpg-game/assets/models/environment/shell-starfish-group.gltf +1 -0
- package/frontiers-rpg-game/assets/ui/index.html +16 -11
- package/frontiers-rpg-game/assets/ui/menus/quests.html +4 -3
- package/frontiers-rpg-game/assets/ui/scene-ui-templates/entity-nameplate.html +12 -8
- package/frontiers-rpg-game/src/GameClock.ts +13 -3
- package/frontiers-rpg-game/src/GameManager.ts +6 -0
- package/frontiers-rpg-game/src/GamePlayer.ts +4 -0
- package/frontiers-rpg-game/src/GameRegion.ts +17 -2
- package/frontiers-rpg-game/src/entities/BaseEntity.ts +6 -0
- package/frontiers-rpg-game/src/entities/enemies/QueenWeaverEntity.ts +1 -0
- package/frontiers-rpg-game/src/items/BaseWeaponItem.ts +2 -2
- package/frontiers-rpg-game/src/regions/hearthwilds/HearthwildsRegion.ts +25 -0
- package/frontiers-rpg-game/src/regions/stalkhaven/StalkhavenRegion.ts +33 -22
- package/package.json +1 -1
- 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.
|
|
341
|
-
|
|
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
|
|
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
|
|
52
|
+
// Calculate sun position with asymmetric day/night cycle (75% day, 25% night)
|
|
53
53
|
const timeProgress = this._timeMs / CYCLE_DURATION_MS;
|
|
54
|
-
|
|
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.
|
|
23
|
-
const DEFAULT_MIN_DIRECTIONAL_LIGHT_INTENSITY = 0.
|
|
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
|
}
|
|
@@ -124,14 +124,14 @@ export default abstract class BaseWeaponItem extends BaseItem {
|
|
|
124
124
|
attack.reach,
|
|
125
125
|
);
|
|
126
126
|
|
|
127
|
-
if (target
|
|
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
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
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,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
|
-
}
|