-
-
Notifications
You must be signed in to change notification settings - Fork 18
/
Hit.c
134 lines (129 loc) · 4.88 KB
/
Hit.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include <Server/Packets/Packets.h>
#include <Server/Server.h>
#include <Util/Checks/PositionChecks.h>
#include <Util/Enums.h>
#include <Util/Log.h>
#include <Util/Nanos.h>
#include <Util/Uthash.h>
// player_hit_id is the player that got shot
// player_id is the player who fired.
void receive_hit_packet(server_t* server, player_t* player, stream_t* data)
{
uint8_t hit_player_id = stream_read_u8(data);
hit_t hit_type = stream_read_u8(data);
player_t* hit_player;
HASH_FIND(hh, server->players, &hit_player_id, sizeof(hit_player_id), hit_player);
if (hit_player == NULL) {
LOG_WARNING("Player %s (#%hhu) hit player who doesn't exist (#%hhu)", player->name, player->id, hit_player_id);
return;
}
vector3f_t shot_pos = player->movement.position;
vector3f_t shot_eye_pos = player->movement.eye_pos;
vector3f_t hit_pos = hit_player->movement.position;
vector3f_t shot_orien = player->movement.forward_orientation;
float distance = distance_in_2d(shot_pos, hit_pos);
long x = 0, y = 0, z = 0;
if (player->sprinting || (player->item == TOOL_GUN && player->weapon_clip == 0)) {
return; // Sprinting and hitting somebody is impossible
}
uint64_t timeNow = get_nanos();
if (allow_shot(
server, player, hit_player, timeNow, distance, &x, &y, &z, shot_pos, shot_orien, hit_pos, shot_eye_pos))
{
if(player->item == TOOL_GUN && player->weapon_pellets != 0) {
player->weapon_pellets--;
}
switch (player->weapon) {
case WEAPON_RIFLE:
{
switch (hit_type) {
case HIT_TYPE_HEAD:
{
send_kill_action_packet(server, player, hit_player, 1, 5, 0);
break;
}
case HIT_TYPE_TORSO:
{
send_set_hp(server, player, hit_player, 49, 1, 0, 5, 0, shot_pos);
break;
}
case HIT_TYPE_ARMS:
{
send_set_hp(server, player, hit_player, 33, 1, 0, 5, 0, shot_pos);
break;
}
case HIT_TYPE_LEGS:
{
send_set_hp(server, player, hit_player, 33, 1, 0, 5, 0, shot_pos);
break;
}
case HIT_TYPE_MELEE:
// Empty so we dont have errors :)
break;
}
break;
}
case WEAPON_SMG:
{
switch (hit_type) {
case HIT_TYPE_HEAD:
{
send_set_hp(server, player, hit_player, 75, 1, 1, 5, 0, shot_pos);
break;
}
case HIT_TYPE_TORSO:
{
send_set_hp(server, player, hit_player, 29, 1, 0, 5, 0, shot_pos);
break;
}
case HIT_TYPE_ARMS:
{
send_set_hp(server, player, hit_player, 18, 1, 0, 5, 0, shot_pos);
break;
}
case HIT_TYPE_LEGS:
{
send_set_hp(server, player, hit_player, 18, 1, 0, 5, 0, shot_pos);
break;
}
case HIT_TYPE_MELEE:
// Empty so we dont have errors :)
break;
}
break;
}
case WEAPON_SHOTGUN:
{
switch (hit_type) {
case HIT_TYPE_HEAD:
{
send_set_hp(server, player, hit_player, 37, 1, 1, 5, 0, shot_pos);
break;
}
case HIT_TYPE_TORSO:
{
send_set_hp(server, player, hit_player, 27, 1, 0, 5, 0, shot_pos);
break;
}
case HIT_TYPE_ARMS:
{
send_set_hp(server, player, hit_player, 16, 1, 0, 5, 0, shot_pos);
break;
}
case HIT_TYPE_LEGS:
{
send_set_hp(server, player, hit_player, 16, 1, 0, 5, 0, shot_pos);
break;
}
case HIT_TYPE_MELEE:
// Empty so we dont have errors :)
break;
}
break;
}
}
if (hit_type == HIT_TYPE_MELEE) {
send_set_hp(server, player, hit_player, 80, 1, 2, 5, 0, shot_pos);
}
}
}