Skip to content

Commit 64ea804

Browse files
committed
add move, tasks, attack, etc...
1 parent 7edaae1 commit 64ea804

27 files changed

+1074
-18
lines changed

GameServer/Client.js

+8
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ class Client {
4242
case 0:
4343
new clientPackets.ProtocolVersion(packet, this);
4444

45+
break;
46+
case 4:
47+
new clientPackets.Action(packet, this);
48+
4549
break;
4650
case 8:
4751
new clientPackets.RequestAuthLogin(packet, this);
@@ -74,6 +78,10 @@ class Client {
7478
case 1:
7579
new clientPackets.MoveBackwardToLocation(packet, this);
7680

81+
break;
82+
case 10:
83+
new clientPackets.RequestAttack(packet, this);
84+
7785
break;
7886
}
7987
}

GameServer/ClientPackets/Action.js

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
const serverPackets = require('./../ServerPackets/serverPackets');
2+
const ClientPacket = require("./ClientPacket");
3+
const players = require('./../Models/Players');
4+
5+
class Action {
6+
constructor(packet, client) {
7+
this._client = client;
8+
this._data = new ClientPacket(packet);
9+
this._data.readC()
10+
.readD()
11+
.readD()
12+
.readD()
13+
.readD()
14+
.readC();
15+
16+
this._init();
17+
}
18+
19+
get objectId() {
20+
return this._data.getData()[1];
21+
}
22+
23+
get originX() {
24+
return this._data.getData()[2];
25+
}
26+
27+
get originY() {
28+
return this._data.getData()[3];
29+
}
30+
31+
get originZ() {
32+
return this._data.getData()[4];
33+
}
34+
35+
get actionId() {
36+
return this._data.getData()[5]; // 0 - click, 1 - shift click
37+
}
38+
39+
_init() {
40+
const player = players.getPlayerByClient(this._client);
41+
42+
this._client.sendPacket(new serverPackets.TargetSelected(this.objectId));
43+
44+
player.target = this.objectId;
45+
}
46+
}
47+
48+
module.exports = Action;

GameServer/ClientPackets/EnterWorld.js

+60
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
const serverPackets = require('./../ServerPackets/serverPackets');
22
const ClientPacket = require("./ClientPacket");
33
const players = require('./../Models/Players');
4+
const npcs = require('./../Models/Npcs');
5+
const tasks = require('./../libs/tasks');
6+
const database = require('./../../Database');
47

58
class EnterWorld {
69
constructor(packet, client) {
@@ -13,9 +16,66 @@ class EnterWorld {
1316

1417
async _init() {
1518
const player = players.getPlayerByClient(this._client);
19+
const spawnedNpcs = npcs.getSpawnedNpcs();
20+
21+
player.x = -72146;
22+
player.y = 257160;
1623

1724
this._client.sendPacket(new serverPackets.UserInfo(player));
1825
this._client.sendPacket(new serverPackets.SunRise());
26+
27+
let objectId = await database.getNextObjectId();
28+
29+
spawnedNpcs.forEach(npc => {
30+
this._client.sendPacket(new serverPackets.NpcInfo(npc));
31+
32+
const path = {
33+
target: {
34+
x: -72727,
35+
y: 258599,
36+
z: -3115
37+
},
38+
origin: {
39+
x: npc.x,
40+
y: npc.y,
41+
z: npc.z
42+
}
43+
}
44+
45+
const angle = Math.atan2(path.target.y - path.origin.y, path.target.x - path.origin.x);
46+
47+
tasks.add({
48+
id: `npc:${npc.objectId}:move`,
49+
time: 1000,
50+
callback: (event) => {
51+
npc.x = npc.x + ((Math.cos(angle) * 55));
52+
npc.y = npc.y + ((Math.sin(angle) * 55));
53+
54+
const dx = path.target.x - npc.x;
55+
const dy = path.target.y - npc.y;
56+
const distance = (Math.sqrt(dx * dx + dy * dy)) - (10);
57+
58+
if (distance < 55) {
59+
npc.x = npc.x + ((Math.cos(angle) * distance));
60+
npc.y = npc.y + ((Math.sin(angle) * distance));
61+
62+
event.stop();
63+
}
64+
65+
this._client.sendPacket(new serverPackets.DropItem(npc, {
66+
objectId: objectId,
67+
itemId: 57,
68+
x: npc.x,
69+
y: npc.y,
70+
z: npc.z
71+
}));
72+
}
73+
});
74+
75+
tasks.start(`npc:${npc.objectId}:move`);
76+
77+
this._client.sendPacket(new serverPackets.MoveToLocation(path, npc.objectId));
78+
});
1979
}
2080
}
2181

GameServer/ClientPackets/MoveBackwardToLocation.js

+221-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
const serverPackets = require('./../ServerPackets/serverPackets');
22
const ClientPacket = require("./ClientPacket");
33
const players = require('./../Models/Players');
4+
const tasks = require('./../libs/tasks');
5+
const database = require('./../../Database');
6+
7+
class Formuls {
8+
nextTickRunSpeed(speed) {
9+
return Math.round((0.1 /speed) * 1_000_000);
10+
}
11+
}
412

513
class MoveBackwardToLocation {
614
constructor(packet, client) {
@@ -36,9 +44,30 @@ class MoveBackwardToLocation {
3644
return this._data.getData()[6];
3745
}
3846

39-
_init() {
47+
async _init() {
4048
const player = players.getPlayerByClient(this._client);
41-
const positions = {
49+
50+
tasks.findById(`move:${player.objectId}`).forEach(task => {
51+
task.remove();
52+
});
53+
54+
player.update({
55+
x: this.originX,
56+
y: this.originY,
57+
z: this.originZ
58+
});
59+
60+
let objectId = await database.getNextObjectId();
61+
62+
this._client.sendPacket(new serverPackets.DropItem(player, {
63+
objectId: objectId++,
64+
itemId: 57,
65+
x: player.x,
66+
y: player.y,
67+
z: player.z
68+
}));
69+
70+
const path = {
4271
target: {
4372
x: this.targetX,
4473
y: this.targetY,
@@ -51,7 +80,196 @@ class MoveBackwardToLocation {
5180
}
5281
}
5382

54-
this._client.sendPacket(new serverPackets.MoveToLocation(positions, player.objectId));
83+
let angle = Math.atan2(path.target.y - path.origin.y, path.target.x - path.origin.x);
84+
85+
const dx = path.target.x - path.origin.x;
86+
const dy = path.target.y - path.origin.y;
87+
88+
let distance = Math.sqrt(dx * dx + dy * dy) - (10 + 9);
89+
90+
// walk
91+
if (distance < 36) {
92+
const d = distance; // fix
93+
94+
tasks.add({
95+
id: `move:${player.objectId}`,
96+
time: (1000 / 88) * distance,
97+
callback: (event) => {
98+
if (event.runs === 1) {
99+
event.stop();
100+
101+
player.attack(this.objectId);
102+
}
103+
104+
player.update({
105+
x: player.x + (Math.cos(angle) * d), // забирается из вне. Значение стирается
106+
y: player.y + (Math.sin(angle) * d),
107+
z: player.z
108+
});
109+
110+
this._client.sendPacket(new serverPackets.DropItem(player, {
111+
objectId: objectId++,
112+
itemId: 57,
113+
x: player.x,
114+
y: player.y,
115+
z: player.z
116+
}));
117+
}
118+
});
119+
120+
distance = 0;
121+
}
122+
123+
// walk
124+
if (distance > 36) {
125+
tasks.add({
126+
id: `move:${player.objectId}`,
127+
time: (1000 / 88) * 36,
128+
callback: (event) => {
129+
if (event.runs === 1) {
130+
event.stop();
131+
}
132+
133+
player.update({
134+
x: player.x + (Math.cos(angle) * 36),
135+
y: player.y + (Math.sin(angle) * 36),
136+
z: player.z
137+
});
138+
139+
this._client.sendPacket(new serverPackets.DropItem(player, {
140+
objectId: objectId++,
141+
itemId: 57,
142+
x: player.x,
143+
y: player.y,
144+
z: player.z
145+
}));
146+
}
147+
});
148+
149+
distance = distance - 36;
150+
}
151+
152+
if (distance < 126) {
153+
const d = distance; // fix
154+
155+
tasks.add({
156+
id: `move:${player.objectId}`,
157+
time: (1000 / 126) * distance,
158+
callback: (event) => {
159+
if (event.runs === 1) {
160+
event.stop();
161+
162+
player.attack(this.objectId);
163+
}
164+
165+
player.update({
166+
x: player.x + (Math.cos(angle) * d),
167+
y: player.y + (Math.sin(angle) * d),
168+
z: player.z
169+
});
170+
171+
this._client.sendPacket(new serverPackets.DropItem(player, {
172+
objectId: objectId++,
173+
itemId: 57,
174+
x: player.x,
175+
y: player.y,
176+
z: player.z
177+
}));
178+
}
179+
});
180+
181+
distance = 0;
182+
}
183+
184+
if (distance > 126) {
185+
tasks.add({
186+
id: `move:${player.objectId}`,
187+
time: 1000,
188+
callback: (event) => {
189+
player.update({
190+
x: player.x + (Math.cos(angle) * 126),
191+
y: player.y + (Math.sin(angle) * 126),
192+
z: player.z
193+
});
194+
195+
this._client.sendPacket(new serverPackets.DropItem(player, {
196+
objectId: objectId++,
197+
itemId: 57,
198+
x: player.x,
199+
y: player.y,
200+
z: player.z
201+
}));
202+
203+
const dx = path.target.x - player.x;
204+
const dy = path.target.y - player.y;
205+
const distance = Math.sqrt(dx * dx + dy * dy) - (10 + 9);
206+
207+
if (distance < 126) {
208+
event.stop();
209+
}
210+
}
211+
});
212+
}
213+
214+
function calculateFinalDistance() {
215+
let x = player.x;
216+
let y = player.y;
217+
218+
let dx = path.target.x - x;
219+
let dy = path.target.y - y;
220+
let distance = Math.sqrt(dx * dx + dy * dy) - 36 - (10 + 9);
221+
222+
while(distance > 126) {
223+
x = x + (Math.cos(angle) * 126);
224+
y = y + (Math.sin(angle) * 126);
225+
226+
dx = path.target.x - x;
227+
dy = path.target.y - y;
228+
distance = Math.sqrt(dx * dx + dy * dy) - 36 - (10 + 9);
229+
}
230+
231+
return distance;
232+
}
233+
234+
if (distance > 126 && (distance % 126) > 0) {
235+
const finalDistance = calculateFinalDistance();
236+
237+
tasks.add({
238+
id: `move:${player.objectId}`,
239+
time: (1000 / 126) * finalDistance,
240+
callback: (event) => {
241+
if (event.runs === 1) {
242+
event.stop();
243+
}
244+
245+
player.update({
246+
x: player.x + (Math.cos(angle) * (finalDistance)),
247+
y: player.y + (Math.sin(angle) * (finalDistance)),
248+
z: player.z
249+
});
250+
251+
this._client.sendPacket(new serverPackets.DropItem(player, {
252+
objectId: objectId++,
253+
itemId: 57,
254+
x: player.x,
255+
y: player.y,
256+
z: player.z
257+
}));
258+
259+
player.attack(this.objectId);
260+
}
261+
});
262+
}
263+
264+
tasks.start(`move:${player.objectId}`);
265+
266+
this._client.sendPacket(new serverPackets.MoveToLocation(path, player.objectId));
267+
268+
// player.update({
269+
// x: this.targetX,
270+
// y: this.targetY,
271+
// z: this.targetZ
272+
// });
55273
}
56274
}
57275

0 commit comments

Comments
 (0)