hytopia 0.3.7 → 0.3.8
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/examples/hygrounds/assets/icons/auto-sniper.png +0 -0
- package/examples/hygrounds/assets/icons/gravity-potion.png +0 -0
- package/examples/hygrounds/assets/icons/revolver.png +0 -0
- package/examples/hygrounds/assets/icons/submachine-gun.png +0 -0
- package/examples/hygrounds/assets/models/items/.optimized/auto-sniper/auto-sniper-named-nodes.glb +0 -0
- package/examples/hygrounds/assets/models/items/.optimized/auto-sniper/auto-sniper.glb +0 -0
- package/examples/hygrounds/assets/models/items/.optimized/auto-sniper/auto-sniper.glb.md5 +1 -0
- package/examples/hygrounds/assets/models/items/.optimized/gravity-potion/gravity-potion-named-nodes.glb +0 -0
- package/examples/hygrounds/assets/models/items/.optimized/gravity-potion/gravity-potion.glb +0 -0
- package/examples/hygrounds/assets/models/items/.optimized/gravity-potion/gravity-potion.glb.md5 +1 -0
- package/examples/hygrounds/assets/models/items/.optimized/revolver/revolver-named-nodes.glb +0 -0
- package/examples/hygrounds/assets/models/items/.optimized/revolver/revolver.glb +0 -0
- package/examples/hygrounds/assets/models/items/.optimized/revolver/revolver.glb.md5 +1 -0
- package/examples/hygrounds/assets/models/items/.optimized/submachine-gun/submachine-gun-named-nodes.glb +0 -0
- package/examples/hygrounds/assets/models/items/.optimized/submachine-gun/submachine-gun.glb +0 -0
- package/examples/hygrounds/assets/models/items/.optimized/submachine-gun/submachine-gun.glb.md5 +1 -0
- package/examples/hygrounds/assets/models/items/auto-sniper.glb +0 -0
- package/examples/hygrounds/assets/models/items/gravity-potion.glb +0 -0
- package/examples/hygrounds/assets/models/items/revolver.glb +0 -0
- package/examples/hygrounds/assets/models/items/submachine-gun.glb +0 -0
- package/examples/hygrounds/assets/ui/index.html +51 -1
- package/examples/hygrounds/classes/GameManager.ts +39 -1
- package/examples/hygrounds/classes/GamePlayerEntity.ts +44 -13
- package/examples/hygrounds/classes/GunEntity.ts +1 -5
- package/examples/hygrounds/classes/ItemFactory.ts +12 -0
- package/examples/hygrounds/classes/items/GravityPotionEntity.ts +48 -0
- package/examples/hygrounds/classes/items/ShieldPotionEntity.ts +1 -1
- package/examples/hygrounds/classes/weapons/AutoShotgunEntity.ts +1 -1
- package/examples/hygrounds/classes/weapons/AutoSniperEntity.ts +43 -0
- package/examples/hygrounds/classes/weapons/LightMachineGunEntity.ts +2 -2
- package/examples/hygrounds/classes/weapons/RevolverEntity.ts +46 -0
- package/examples/hygrounds/classes/weapons/RocketLauncherEntity.ts +11 -2
- package/examples/hygrounds/classes/weapons/ShotgunEntity.ts +1 -1
- package/examples/hygrounds/classes/weapons/SubmachineGunEntity.ts +43 -0
- package/examples/hygrounds/gameConfig.ts +38 -6
- package/examples/hygrounds/index.ts +2 -1
- package/examples/player-persistence/README.md +3 -0
- package/examples/player-persistence/assets/map.json +2623 -0
- package/examples/player-persistence/dev/persistence/player-player-1.json +6 -0
- package/examples/player-persistence/dev/persistence/test.json +3 -0
- package/examples/player-persistence/index.ts +126 -0
- package/examples/player-persistence/package.json +16 -0
- package/package.json +1 -1
- package/server.js +1 -1
- /package/examples/hygrounds/assets/audio/sfx/{shield-potion-consume.mp3 → potion-consume.mp3} +0 -0
@@ -0,0 +1,126 @@
|
|
1
|
+
import {
|
2
|
+
startServer,
|
3
|
+
PlayerEntity,
|
4
|
+
PlayerEvent,
|
5
|
+
Player,
|
6
|
+
PersistenceManager,
|
7
|
+
} from 'hytopia';
|
8
|
+
|
9
|
+
import worldMap from './assets/map.json';
|
10
|
+
|
11
|
+
startServer(world => {
|
12
|
+
world.loadMap(worldMap);
|
13
|
+
|
14
|
+
// Handle player join
|
15
|
+
world.on(PlayerEvent.JOINED_WORLD, ({ player }) => {
|
16
|
+
const playerEntity = new PlayerEntity({
|
17
|
+
player,
|
18
|
+
name: 'Player',
|
19
|
+
modelUri: 'models/players/player.gltf',
|
20
|
+
modelLoopedAnimations: ['idle'],
|
21
|
+
modelScale: 0.5,
|
22
|
+
});
|
23
|
+
|
24
|
+
playerEntity.spawn(world, { x: 0, y: 10, z: 0 });
|
25
|
+
|
26
|
+
help(player);
|
27
|
+
});
|
28
|
+
|
29
|
+
// Handle player leave
|
30
|
+
world.on(PlayerEvent.LEFT_WORLD, ({ player }) => {
|
31
|
+
world.entityManager.getPlayerEntitiesByPlayer(player).forEach(entity => entity.despawn());
|
32
|
+
});
|
33
|
+
|
34
|
+
// Command definitions with help text
|
35
|
+
type Command = {
|
36
|
+
command: string;
|
37
|
+
description: string;
|
38
|
+
args?: string;
|
39
|
+
handler: (player: Player, args: string[]) => void;
|
40
|
+
};
|
41
|
+
|
42
|
+
const commands: Record<string, Command> = {
|
43
|
+
help: {
|
44
|
+
command: '/help',
|
45
|
+
description: 'Shows all available commands',
|
46
|
+
handler: (player: Player) => help(player),
|
47
|
+
},
|
48
|
+
whoami: {
|
49
|
+
command: '/whoami',
|
50
|
+
description: 'Shows your username and ID',
|
51
|
+
handler: (player: Player) => {
|
52
|
+
sendMessage(player, `You are ${player.username} | Your ID is ${player.id}`);
|
53
|
+
}
|
54
|
+
},
|
55
|
+
setPlayerKeyValue: {
|
56
|
+
command: '/setplayerkeyvalue',
|
57
|
+
description: 'Sets a player state key with a string value',
|
58
|
+
args: '<key> <value>',
|
59
|
+
handler: (player: Player, args: string[]) => {
|
60
|
+
const [key, ...value] = args;
|
61
|
+
if (!key || value.length === 0) return sendMessage(player, 'Usage: /setplayerkeyvalue <key> <value>', 'FF0000');
|
62
|
+
|
63
|
+
player.setPersistedData({ [key]: value.join(' ') });
|
64
|
+
sendMessage(player, `Set player state: ${key} = ${value.join(' ')}`);
|
65
|
+
}
|
66
|
+
},
|
67
|
+
setPlayerKeyJson: {
|
68
|
+
command: '/setplayerkeyjson',
|
69
|
+
description: 'Sets a player state key with a JSON value',
|
70
|
+
args: '<key> <json>',
|
71
|
+
handler: (player: Player, args: string[]) => {
|
72
|
+
const [key, ...value] = args;
|
73
|
+
if (!key || value.length === 0) return sendMessage(player, 'Usage: /setplayerkeyjson <key> <json>', 'FF0000');
|
74
|
+
|
75
|
+
try {
|
76
|
+
const jsonValue = JSON.parse(value.join(' '));
|
77
|
+
player.setPersistedData({ [key]: jsonValue });
|
78
|
+
sendMessage(player, `Set player state: ${key} = ${JSON.stringify(jsonValue)}`);
|
79
|
+
} catch (e) {
|
80
|
+
sendMessage(player, 'Invalid JSON value', 'FF0000');
|
81
|
+
}
|
82
|
+
}
|
83
|
+
},
|
84
|
+
getPlayerState: {
|
85
|
+
command: '/getplayerstate',
|
86
|
+
description: 'Gets all player state',
|
87
|
+
handler: async (player: Player) => {
|
88
|
+
const value = await player.getPersistedData();
|
89
|
+
sendMessage(player, `Player state: ${JSON.stringify(value, null, 2)}`);
|
90
|
+
}
|
91
|
+
},
|
92
|
+
deletePlayerKey: {
|
93
|
+
command: '/deleteplayerkey',
|
94
|
+
description: 'Deletes a player state key',
|
95
|
+
args: '<key>',
|
96
|
+
handler: (player: Player, args: string[]) => {
|
97
|
+
const [key] = args;
|
98
|
+
if (!key) return sendMessage(player, 'Usage: /deleteplayerkey <key>', 'FF0000');
|
99
|
+
|
100
|
+
player.setPersistedData({ [key]: undefined });
|
101
|
+
sendMessage(player, `Deleted player state key: ${key}`);
|
102
|
+
}
|
103
|
+
}
|
104
|
+
};
|
105
|
+
|
106
|
+
// Helper function for sending messages
|
107
|
+
function sendMessage(player: Player, message: string, color = '00FF00') {
|
108
|
+
world.chatManager.sendPlayerMessage(player, message, color);
|
109
|
+
}
|
110
|
+
|
111
|
+
// Register all commands
|
112
|
+
Object.values(commands).forEach(({ command, handler }) => {
|
113
|
+
world.chatManager.registerCommand(command, handler);
|
114
|
+
});
|
115
|
+
|
116
|
+
// Help command implementation
|
117
|
+
function help(player: Player) {
|
118
|
+
sendMessage(player, '=== Available Commands ===');
|
119
|
+
Object.values(commands).forEach(cmd => {
|
120
|
+
const usage = cmd.args ? `${cmd.command} ${cmd.args}` : cmd.command;
|
121
|
+
sendMessage(player, `${usage}`);
|
122
|
+
sendMessage(player, ` ${cmd.description}`);
|
123
|
+
sendMessage(player, '---');
|
124
|
+
});
|
125
|
+
}
|
126
|
+
});
|
@@ -0,0 +1,16 @@
|
|
1
|
+
{
|
2
|
+
"name": "payload-game",
|
3
|
+
"version": "1.0.0",
|
4
|
+
"description": "",
|
5
|
+
"main": "index.js",
|
6
|
+
"scripts": {
|
7
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
8
|
+
},
|
9
|
+
"keywords": [],
|
10
|
+
"author": "",
|
11
|
+
"license": "ISC",
|
12
|
+
"dependencies": {
|
13
|
+
"@hytopia.com/assets": "latest",
|
14
|
+
"hytopia": "latest"
|
15
|
+
}
|
16
|
+
}
|