3 * =============================================================================
4 * SourceMod Sample Extension
5 * Copyright (C) 2004-2008 AlliedModders LLC. All rights reserved.
6 * =============================================================================
8 * This program is free software; you can redistribute it and/or modify it under
9 * the terms of the GNU General Public License, version 3.0, as published by the
10 * Free Software Foundation.
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
17 * You should have received a copy of the GNU General Public License along with
18 * this program. If not, see <http://www.gnu.org/licenses/>.
20 * As a special exception, AlliedModders LLC gives you permission to link the
21 * code of this program (as well as its derivative works) to "Half-Life 2," the
22 * "Source Engine," the "SourcePawn JIT," and any Game MODs that run on software
23 * by the Valve Corporation. You must obey the GNU General Public License in
24 * all respects for all other code used. Additionally, AlliedModders LLC grants
25 * this exception to all derivative works. AlliedModders LLC defines further
26 * exceptions, found in LICENSE.txt (as of this writing, version JULY-31-2007),
27 * or <http://www.sourcemod.net/license.php>.
32 #include "StructHandle.h"
33 #include "extension.h"
35 bool StructHandle::GetInt( const char *member, int *value )
39 if (!info->getOffset(member, &offset))
46 if (!info->getType(member, &type))
55 *value = *(uint8 *)((unsigned char *)data + offset);
61 *value = *(uint16 *)((unsigned char *)data + offset);
67 *value = *(uint32 *)((unsigned char *)data + offset);
71 case Member_Int8Pointer:
73 *value = **(uint8 **)((unsigned char *)data + offset);
77 case Member_Int16Pointer:
79 *value = **(uint16 **)((unsigned char *)data + offset);
83 case Member_Int32Pointer:
85 *value = **(uint32 **)((unsigned char *)data + offset);
98 bool StructHandle::GetFloat( const char *member, float *value )
102 if (!info->getOffset(member, &offset))
109 if (!info->getType(member, &type))
118 *value = *(float *)((unsigned char *)data + offset);
122 case Member_FloatPointer:
124 *value = **(float **)((unsigned char *)data + offset);
137 bool StructHandle::SetInt( const char *member, int value )
141 if (!info->getOffset(member, &offset))
148 if (!info->getType(member, &type))
157 *(uint8 *)((unsigned char *)data + offset) = value;
163 *(uint16 *)((unsigned char *)data + offset) = value;
169 *(uint32 *)((unsigned char *)data + offset) = value;
173 case Member_Int8Pointer:
175 **(uint8 **)((unsigned char *)data + offset) = value;
179 case Member_Int16Pointer:
181 **(uint16 **)((unsigned char *)data + offset) = value;
185 case Member_Int32Pointer:
187 **(uint32 **)((unsigned char *)data + offset) = value;
200 bool StructHandle::SetFloat( const char *member, float value )
204 if (!info->getOffset(member, &offset))
211 if (!info->getType(member, &type))
220 *(float *)((unsigned char *)data + offset) = value;
224 case Member_FloatPointer:
226 **(float **)((unsigned char *)data + offset) = value;
239 bool StructHandle::IsPointerNull( const char *member, bool *result )
243 if (!info->getOffset(member, &offset))
250 if (!info->getType(member, &type))
257 case Member_Int8Pointer:
258 case Member_Int16Pointer:
259 case Member_Int32Pointer:
260 case Member_FloatPointer:
261 case Member_CharPointer:
262 case Member_VectorPointer:
263 case Member_EHandlePointer:
265 *result = *((unsigned char **)data + offset) == NULL;
278 bool StructHandle::setPointerNull( const char *member )
282 if (!info->getOffset(member, &offset))
289 if (!info->getType(member, &type))
296 case Member_Int8Pointer:
297 case Member_Int16Pointer:
298 case Member_Int32Pointer:
299 case Member_FloatPointer:
300 case Member_CharPointer:
301 case Member_VectorPointer:
302 case Member_EHandlePointer:
304 *((unsigned char **)data + offset) = NULL;
317 bool StructHandle::GetVector( const char *member, Vector *vec )
321 if (!info->getOffset(member, &offset))
328 if (!info->getType(member, &type))
337 *vec = *(Vector *)((unsigned char *)data + offset);
341 case Member_VectorPointer:
343 *vec = **(Vector **)((unsigned char *)data + offset);
356 bool StructHandle::SetVector( const char *member, Vector vec )
360 if (!info->getOffset(member, &offset))
367 if (!info->getType(member, &type))
376 *(Vector *)((unsigned char *)data + offset) = vec;
380 case Member_VectorPointer:
382 **(Vector **)((unsigned char *)data + offset) = vec;
395 bool StructHandle::GetString( const char *member, char **string )
399 if (!info->getOffset(member, &offset))
406 if (!info->getType(member, &type))
415 *string = (char *)((unsigned char *)data + offset);
419 case Member_CharPointer:
421 *string = *(char **)((unsigned char *)data + offset);
434 bool StructHandle::SetString( const char *member, char *string )
438 if (!info->getOffset(member, &offset))
445 if (!info->getType(member, &type))
455 info->getSize(member, &size);
456 char *location = (char *)data + offset;
457 UTIL_Format(location, size, "%s", string);
461 case Member_CharPointer:
464 info->getSize(member, &size);
465 char *location = *(char **)((unsigned char *)data + offset);
466 UTIL_Format(location, size, "%s", string);
479 bool StructHandle::GetEHandle( const char *member, CBaseHandle **handle )
483 if (!info->getOffset(member, &offset))
490 if (!info->getType(member, &type))
499 *handle = (CBaseHandle *)((unsigned char *)data + offset);
503 case Member_EHandlePointer:
505 *handle = *(CBaseHandle **)((unsigned char *)data + offset);
518 bool StructHandle::SetEHandle( const char *member, CBaseHandle *handle )
522 if (!info->getOffset(member, &offset))
529 if (!info->getType(member, &type))
538 *(CBaseHandle *)((unsigned char *)data + offset) = *handle;
542 case Member_FloatPointer:
544 **(CBaseHandle **)((unsigned char *)data + offset) = *handle;