-
Notifications
You must be signed in to change notification settings - Fork 1
/
natives.cpp
111 lines (81 loc) · 2.29 KB
/
natives.cpp
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
#include "natives.h"
static cell_t PlayerAvatarGet(IPluginContext *pContext, const cell_t *params)
{
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(params[1]);
if (!pPlayer)
{
pContext->ReportError("Client index %d is invalid", params[1]);
return 0;
}
if (!pPlayer->IsConnected())
{
pContext->ReportError("Client %d is not connected", params[1]);
return 0;
}
KeyValues *pDest = smutils->ReadKeyValuesHandle(params[2]);
if (!pDest)
{
pContext->ReportError("Invalid Handle");
return 0;
}
KeyValues *pAvatarInfo = g_DirectorAvatarExt.PlayerAvatarGet(pPlayer->GetEdict());
if (pAvatarInfo)
{
*pDest = *pAvatarInfo;
}
return pAvatarInfo != NULL;
}
static cell_t PlayerAvatarUnpack(IPluginContext *pContext, const cell_t *params)
{
KeyValues *pAvatarInfo = smutils->ReadKeyValuesHandle(params[1]);
if (!pAvatarInfo)
{
pContext->ReportError("Invalid Handle");
return 0;
}
int iAvatarTeam = TEAM_UNASSIGNED;
SurvivorCharacterType eAvatarSurvivorCharacter = SurvivorCharacter_Unknown;
g_DirectorAvatarExt.PlayerAvatarUnpack(pAvatarInfo, iAvatarTeam, eAvatarSurvivorCharacter);
cell_t *pTeam = NULL;
if (pContext->LocalToPhysAddr(params[2], &pTeam) != SP_ERROR_NONE)
{
pTeam = NULL;
}
cell_t *pSurvivorCharacter = NULL;
if (pContext->LocalToPhysAddr(params[3], &pSurvivorCharacter) != SP_ERROR_NONE)
{
pSurvivorCharacter = NULL;
}
*pTeam = iAvatarTeam;
*pSurvivorCharacter = eAvatarSurvivorCharacter;
return 1;
}
static cell_t SetAvatarBasedOnCurrentTeam(IPluginContext *pContext, const cell_t *params)
{
IGamePlayer *pPlayer = playerhelpers->GetGamePlayer(params[1]);
if (!pPlayer)
{
pContext->ReportError("Client index %d is invalid", params[1]);
return 0;
}
if (!pPlayer->IsConnected())
{
pContext->ReportError("Client %d is not connected", params[1]);
return 0;
}
KeyValues *pAvatarInfo = smutils->ReadKeyValuesHandle(params[2]);
if (!pAvatarInfo)
{
pContext->ReportError("Invalid Handle");
return 0;
}
g_DirectorAvatarExt.SetAvatarBasedOnCurrentTeam(gamehelpers->ReferenceToEntity(params[1]), pAvatarInfo);
return 1;
}
const sp_nativeinfo_t g_Natives[] =
{
{ "PlayerAvatarGet", PlayerAvatarGet },
{ "PlayerAvatarUnpack", PlayerAvatarUnpack },
{ "SetAvatarBasedOnCurrentTeam", SetAvatarBasedOnCurrentTeam },
{ nullptr, nullptr },
};