Remove Dynamic as a dependency. (#417)

This commit is contained in:
shavitush 2017-07-28 06:15:56 +03:00
parent 0b7b92f94d
commit d3a0d5b7f9
8 changed files with 125 additions and 1056 deletions

View File

@ -1,135 +0,0 @@
/**
* =============================================================================
* Dynamic for SourceMod (C)2016 Matthew J Dunn. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#if defined _dynamic_basic_included
#endinput
#endif
#define _dynamic_basic_included
/*
This methodmap is based on the Dynamic methodmap while using a StringMap methodmap
for implementation. This methodmap doesn't implement the full features of the Dynamic
methodmap (type conversion, object naming, plugin sharing, ect). This methodmap can
be used for basic storage using the standard Dynamic methodmap Methods.
Please see '\scripting\dynamic\examples\basic\' for an example usage of this methodmap
*/
methodmap Basic < StringMap
{
public Basic()
{
return new StringMap();
}
public void Dispose(bool disposemembers=true)
{
delete this;
}
public int GetInt(const char[] membername, int defaultvalue=-1)
{
int value;
if (this.GetValue(membername, value))
return value;
return defaultvalue;
}
public void SetInt(const char[] membername, int value)
{
this.SetValue(membername, value);
}
public bool GetBool(const char[] membername, bool defaultvalue=false)
{
bool value;
if (this.GetValue(membername, value))
return value;
return defaultvalue;
}
public void SetBool(const char[] membername, bool value)
{
this.SetValue(membername, value);
}
public float GetFloat(const char[] membername, float defaultvalue=-1.0)
{
float value;
if (this.GetValue(membername, value))
return value;
return defaultvalue;
}
public void SetFloat(const char[] membername, float value)
{
this.SetValue(membername, value);
}
public bool GetString(const char[] membername, char[] buffer, int length)
{
return this.GetString(membername, buffer, length);
}
public void SetString(const char[] membername, const char[] value)
{
this.SetString(membername, value);
}
public Dynamic GetObject(const char[] membername)
{
Dynamic value;
if (this.GetValue(membername, value))
return value;
return INVALID_DYNAMIC_OBJECT;
}
public void SetObject(const char[] membername, Dynamic value)
{
this.SetValue(membername, value);
}
public Handle GetHandle(const char[] membername)
{
Handle value;
if (this.GetValue(membername, value))
return value;
return null;
}
public void SetHandle(const char[] membername, Handle value)
{
this.SetValue(membername, value);
}
public bool GetVector(const char[] membername, float[3] vector)
{
return this.GetArray(membername, vector, sizeof(vector));
}
public void SetVector(const char[] membername, const float[3] value)
{
this.SetArray(membername, value, sizeof(value));
}
}

View File

@ -1,110 +0,0 @@
/**
* =============================================================================
* Dynamic for SourceMod (C)2016 Matthew J Dunn. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#if defined _dynamic_collection_included
#endinput
#endif
#define _dynamic_collection_included
/*
This methodmap is used to store typed collections based on Dynamic methodmaps. Internally
an ArrayList is used for storage. This methodmap can be inherited by your own methodmaps
where you can override the Items method to return your custom methodmap type which MUST
inherit a Dynamic methodmap.
Please see '\scripting\dynamic\examples\collections\' for an example usage of this methodmap
*/
methodmap Collection < ArrayList
{
public Collection()
{
return view_as<Collection>(new ArrayList());
}
public void Clear(bool disposemembers=true)
{
if (disposemembers)
{
int count = this.Length;
Dynamic member;
for (int i = 0; i < count; i++)
{
member = view_as<Dynamic>(i);
if (!member.IsValid)
continue;
member.Dispose();
}
}
this.Clear();
}
public void Dispose(bool disposemembers=true)
{
if (disposemembers)
this.Clear(true);
CloseHandle(this);
}
public Dynamic Items(int index)
{
return this.Get(index);
}
property int Count
{
public get()
{
return this.Length;
}
}
public int AddItem(Dynamic item)
{
this.Push(item);
}
public int FindItem(Dynamic item)
{
int count = this.Length;
for (int i = 0; i < count; i++)
{
if (this.Get(i) == item)
return i;
}
return -1;
}
public void RemoveItem(Dynamic item)
{
int index = this.FindItem(item);
if (index == -1)
return;
this.Erase(index);
}
public void RemoveIndex(int index)
{
this.Erase(index);
}
}

View File

@ -1,706 +0,0 @@
/**
* =============================================================================
* Dynamic for SourceMod (C)2016 Matthew J Dunn. All rights reserved.
* =============================================================================
*
* This program is free software; you can redistribute it and/or modify it under
* the terms of the GNU General Public License, version 3.0, as published by the
* Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
* details.
*
* You should have received a copy of the GNU General Public License along with
* this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#if defined _dynamic_included
#endinput
#endif
#define _dynamic_included
#if defined dynamic_use_local_methodmap
#define INVALID_DYNAMIC_OBJECT view_as<DynamicObject>(-1)
#else
#define INVALID_DYNAMIC_OBJECT view_as<Dynamic>(-1)
#endif
#define Invalid_Dynamic_Object -1
#define INVALID_DYNAMIC_OFFSET -1
#define DYNAMIC_MEMBERNAME_MAXLEN 64
enum Dynamic_MemberType
{
DynamicType_Int = 0,
DynamicType_Float = 1,
DynamicType_String = 2,
DynamicType_Object = 3,
DynamicType_Dynamic = 3,
DynamicType_Bool = 4,
DynamicType_Handle = 5,
DynamicType_Vector = 6,
DynamicType_Unknown = 7
}
enum Dynamic_Operator
{
DynamicOperator_Equals=0,
DynamicOperator_NotEquals,
}
typeset Dynamic_HookType
{
// HookChanges
function void (Dynamic obj, int offset, const char[] member, Dynamic_MemberType type);
// DynamicReadKeyValue
function Action (Dynamic obj, const char[] member, int depth);
}
native int Dynamic_GetCollectionSize();
native Dynamic Dynamic_Initialise(int blocksize=64, int startsize=0, bool persistent=false);
native bool Dynamic_IsValid(int index, bool throwerror=false);
native bool Dynamic_Dispose(int index, bool disposemembers=true);
native bool Dynamic_ResetObject(int index, bool disposemembers=true, int blocksize=0, int startsize=0);
native Handle Dynamic_GetOwnerPlugin(Dynamic obj);
native bool Dynamic_SetName(Dynamic obj, const char[] objectname, bool replace=false);
native Dynamic Dynamic_FindByName(const char[] objectname);
native Dynamic Dynamic_GetParent(Dynamic obj);
native bool Dynamic_GetName(Dynamic obj, char[] buffer, int length);
native bool Dynamic_GetPersistence(Dynamic obj);
native bool Dynamic_SetPersistence(Dynamic obj, bool value);
native bool Dynamic_ReadConfig(Dynamic obj, const char[] path, bool use_valve_fs=false, int valuelength=256);
native bool Dynamic_WriteConfig(Dynamic obj, const char[] path);
native bool Dynamic_ReadKeyValues(Dynamic obj, const char[] path, int valuelength, Dynamic_HookType callback=INVALID_FUNCTION);
native bool Dynamic_WriteKeyValues(Dynamic obj, const char[] path, const char[] basekey);
native int Dynamic_GetMemberCount(Dynamic obj);
native int Dynamic_GetMemberOffset(Dynamic obj, const char[] membername);
native int Dynamic_GetMemberOffsetByIndex(Dynamic obj, int index);
native bool Dynamic_GetMemberNameByIndex(Dynamic obj, int index, char[] buffer, int length);
native bool Dynamic_GetMemberNameByOffset(Dynamic obj, int offset, char[] buffer, int length);
native Dynamic_MemberType Dynamic_GetMemberType(Dynamic obj, const char[] membername);
native Dynamic_MemberType Dynamic_GetMemberTypeByOffset(Dynamic obj, int offset);
native bool Dynamic_SortMembers(Dynamic obj, SortOrder order);
native ArrayList Dynamic_FindByMemberValue(Dynamic obj, Dynamic params);
native int Dynamic_CallbackCount(Dynamic obj);
native bool Dynamic_HookChanges(Dynamic obj, Dynamic_HookType callback);
native bool Dynamic_UnHookChanges(Dynamic obj, Dynamic_HookType callback);
native int Dynamic_GetInt(Dynamic obj, const char[] membername, int defaultvalue=-1);
native int Dynamic_SetInt(Dynamic obj, const char[] membername, int value);
native int Dynamic_GetIntByOffset(Dynamic obj, int offset, int defaultvalue=-1);
native bool Dynamic_SetIntByOffset(Dynamic obj, int offset, int value);
native int Dynamic_PushInt(Dynamic obj, int value, const char[] name="");
native int Dynamic_GetIntByIndex(Dynamic obj, int index, int defaultvalue=-1);
native float Dynamic_GetFloat(Dynamic obj, const char[] membername, float defaultvalue=-1.0);
native int Dynamic_SetFloat(Dynamic obj, const char[] membername, float value);
native float Dynamic_GetFloatByOffset(Dynamic obj, int offset, float defaultvalue=-1.0);
native bool Dynamic_SetFloatByOffset(Dynamic obj, int offset, float value);
native int Dynamic_PushFloat(Dynamic obj, float value, const char[] name="");
native float Dynamic_GetFloatByIndex(Dynamic obj, int index, float defaultvalue=-1.0);
native bool Dynamic_GetString(Dynamic obj, const char[] membername, char[] buffer, int length);
native int Dynamic_SetString(Dynamic obj, const char[] membername, const char[] value, int length=0);
native bool Dynamic_GetStringByOffset(Dynamic obj, int offset, char[] buffer, int length);
native bool Dynamic_SetStringByOffset(Dynamic obj, int offset, const char[] value, int length=0);
native int Dynamic_PushString(Dynamic obj, const char[] value, int length=0, const char[] name="");
native bool Dynamic_GetStringByIndex(Dynamic obj, int index, char[] buffer, int length);
native int Dynamic_GetStringLength(Dynamic obj, const char[] membername);
native int Dynamic_GetStringLengthByOffset(Dynamic obj, int offset);
native bool Dynamic_CompareString(Dynamic obj, const char[] membername, const char[] value, bool casesensitive=true);
// This can be removed at some point in the future
#pragma deprecated Use Dynamic_GetDynamic() instead
native Dynamic Dynamic_GetObject(Dynamic obj, const char[] membername);
#pragma deprecated Use Dynamic_SetDynamic() instead
native int Dynamic_SetObject(Dynamic obj, const char[] membername, Dynamic value);
#pragma deprecated Use Dynamic_GetDynamicByOffset() instead
native Dynamic Dynamic_GetObjectByOffset(Dynamic obj, int offset);
#pragma deprecated Use Dynamic_SetDynamicByOffset() instead
native bool Dynamic_SetObjectByOffset(Dynamic obj, int offset, Dynamic value);
#pragma deprecated Use Dynamic_PushDynamic() instead
native int Dynamic_PushObject(Dynamic obj, Dynamic value, const char[] name="");
#pragma deprecated Use Dynamic_GetDynamicByIndex() instead
native Dynamic Dynamic_GetObjectByIndex(Dynamic obj, int index);
#pragma deprecated Use Dynamic_SetDynamicByIndex() instead
native bool Dynamic_SetObjectByIndex(Dynamic obj, int index, Dynamic value);
native Dynamic Dynamic_GetDynamic(Dynamic obj, const char[] membername);
native int Dynamic_SetDynamic(Dynamic obj, const char[] membername, Dynamic value);
native Dynamic Dynamic_GetDynamicByOffset(Dynamic obj, int offset);
native bool Dynamic_SetDynamicByOffset(Dynamic obj, int offset, Dynamic value);
native int Dynamic_PushDynamic(Dynamic obj, Dynamic value, const char[] name="");
native Dynamic Dynamic_GetDynamicByIndex(Dynamic obj, int index);
native bool Dynamic_SetDynamicByIndex(Dynamic obj, int index, Dynamic value);
native bool Dynamic_GetBool(Dynamic obj, const char[] membername, bool defaultvalue=false);
native int Dynamic_SetBool(Dynamic obj, const char[] membername, bool value);
native bool Dynamic_GetBoolByOffset(Dynamic obj, int offset, bool defaultvalue=false);
native bool Dynamic_SetBoolByOffset(Dynamic obj, int offset, bool value);
native int Dynamic_PushBool(Dynamic obj, bool value, const char[] name="");
native bool Dynamic_GetBoolByIndex(Dynamic obj, int index, bool defaultvalue=false);
native Handle Dynamic_GetHandle(Dynamic obj, const char[] membername);
native int Dynamic_SetHandle(Dynamic obj, const char[] membername, Handle value);
native Handle Dynamic_GetHandleByOffset(Dynamic obj, int offset);
native bool Dynamic_SetHandleByOffset(Dynamic obj, int offset, Handle value);
native int Dynamic_PushHandle(Dynamic obj, Handle value, const char[] name="");
native Handle Dynamic_GetHandleByIndex(Dynamic obj, int index);
native bool Dynamic_GetVector(Dynamic obj, const char[] membername, float value[3]);
native int Dynamic_SetVector(Dynamic obj, const char[] membername, const float value[3]);
native bool Dynamic_GetVectorByOffset(Dynamic obj, int offset, float value[3]);
native bool Dynamic_SetVectorByOffset(Dynamic obj, int offset, const float value[3]);
native int Dynamic_PushVector(Dynamic obj, const float value[3], const char[] name="");
native bool Dynamic_GetVectorByIndex(Dynamic obj, int index, float value[3]);
methodmap Dynamic
{
#if defined dynamic_persistent
public Dynamic(int blocksize=64, int startsize=0, bool persistent=true)
{
return Dynamic_Initialise(blocksize, startsize, persistent);
}
#else
public Dynamic(int blocksize=64, int startsize=0, bool persistent=false)
{
return Dynamic_Initialise(blocksize, startsize, persistent);
}
#endif
property int IsValid
{
public get()
{
return Dynamic_IsValid(view_as<int>(this), false);
}
}
property bool Persistent
{
public get()
{
return Dynamic_GetPersistence(this);
}
public set(bool value)
{
Dynamic_SetPersistence(this, value);
}
}
property Dynamic Parent
{
public get()
{
return Dynamic_GetParent(this);
}
}
public bool GetName(char[] buffer, int length)
{
return Dynamic_GetName(this, buffer, length);
}
property int MemberCount
{
public get()
{
return Dynamic_GetMemberCount(this);
}
}
public void Dispose(bool disposemembers=true)
{
Dynamic_Dispose(view_as<int>(this), disposemembers);
}
public bool Reset(bool disposemembers=true, int blocksize=0, int startsize=0)
{
return Dynamic_ResetObject(view_as<int>(this), disposemembers, blocksize, startsize);
}
property Handle OwnerPlugin
{
public get()
{
return Dynamic_GetOwnerPlugin(this);
}
}
public bool SetName(const char[] objectname, bool replace=false)
{
return Dynamic_SetName(this, objectname, replace);
}
public static Dynamic FindByName(const char[] objectname)
{
return Dynamic_FindByName(objectname);
}
public bool ReadConfig(const char[] path, bool use_valve_fs = false, int valuelength=256)
{
return Dynamic_ReadConfig(this, path, use_valve_fs, valuelength);
}
public bool WriteConfig(const char[] path)
{
return Dynamic_WriteConfig(this, path);
}
public bool ReadKeyValues(const char[] path, int valuelength = 256, Dynamic_HookType callback = INVALID_FUNCTION)
{
return Dynamic_ReadKeyValues(this, path, valuelength, callback);
}
public bool WriteKeyValues(const char[] path, const char[] basekey="")
{
return Dynamic_WriteKeyValues(this, path, basekey);
}
public static Dynamic GetSettings()
{
return view_as<Dynamic>(0);
}
public static Dynamic GetPlayerSettings(int client)
{
return view_as<Dynamic>(client);
}
public int GetInt(const char[] membername, int defaultvalue=-1)
{
return Dynamic_GetInt(this, membername, defaultvalue);
}
public int SetInt(const char[] membername, int value)
{
return Dynamic_SetInt(this, membername, value);
}
public int GetIntByOffset(int offset, int defaultvalue=-1)
{
return Dynamic_GetIntByOffset(this, offset, defaultvalue);
}
public void SetIntByOffset(int offset, int value)
{
Dynamic_SetIntByOffset(this, offset, value);
}
public int PushInt(int value, const char[] name="")
{
return Dynamic_PushInt(this, value, name);
}
public int GetIntByIndex(int index, int defaultvalue=-1)
{
return Dynamic_GetIntByIndex(this, index, defaultvalue);
}
public bool GetBool(const char[] membername, bool defaultvalue = false)
{
return Dynamic_GetBool(this, membername, defaultvalue);
}
public int SetBool(const char[] membername, bool value)
{
return Dynamic_SetBool(this, membername, value);
}
public bool GetBoolByOffset(int offset, bool defaultvalue = false)
{
return Dynamic_GetBoolByOffset(this, offset, defaultvalue);
}
public void SetBoolByOffset(int offset, bool value)
{
Dynamic_SetBoolByOffset(this, offset, value);
}
public int PushBool(bool value, const char[] name="")
{
return Dynamic_PushBool(this, value, name);
}
public bool GetBoolByIndex(int index, bool defaultvalue = false)
{
return Dynamic_GetBoolByIndex(this, index, defaultvalue);
}
public float GetFloat(const char[] membername, float defaultvalue=-1.0)
{
return Dynamic_GetFloat(this, membername, defaultvalue);
}
public int SetFloat(const char[] membername, float value)
{
return Dynamic_SetFloat(this, membername, value);
}
public float GetFloatByOffset(int offset, float defaultvalue=-1.0)
{
return Dynamic_GetFloatByOffset(this, offset, defaultvalue);
}
public void SetFloatByOffset(int offset, float value)
{
Dynamic_SetFloatByOffset(this, offset, value);
}
public int PushFloat(float value, const char[] name="")
{
return Dynamic_PushFloat(this, value, name);
}
public float GetFloatByIndex(int index, float defaultvalue=-1.0)
{
return Dynamic_GetFloatByIndex(this, index, defaultvalue);
}
public bool GetString(const char[] membername, char[] buffer, int length)
{
return Dynamic_GetString(this, membername, buffer, length);
}
public int SetString(const char[] membername, const char[] value, int length=0)
{
return Dynamic_SetString(this, membername, value, length);
}
public int GetStringByOffset(int offset, char[] buffer, int length)
{
return Dynamic_GetStringByOffset(this, offset, buffer, length);
}
public void SetStringByOffset(const int offset, const char[] value, int length=0)
{
Dynamic_SetStringByOffset(this, offset, value, length);
}
public int PushString(const char[] value, int length=0, const char[] name="")
{
return Dynamic_PushString(this, value, length, name);
}
public bool GetStringByIndex(int index, char[] buffer, int length)
{
return Dynamic_GetStringByIndex(this, index, buffer, length);
}
public int GetStringLength(const char[] membername)
{
return Dynamic_GetStringLength(this, membername);
}
public int GetStringLengthByOffset(int offset)
{
return Dynamic_GetStringLengthByOffset(this, offset);
}
public bool CompareString(const char[] membername, const char[] value, bool casesensitive=true)
{
return Dynamic_CompareString(this, membername, value, casesensitive);
}
#pragma deprecated Use .GetDynamic() instead
public Dynamic GetObject(const char[] membername)
{
return Dynamic_GetDynamic(this, membername);
}
#pragma deprecated Use .SetDynamic() instead
public int SetObject(const char[] membername, Dynamic value)
{
return Dynamic_SetDynamic(this, membername, value);
}
#pragma deprecated Use .SetDynamicByOffset() instead
public Dynamic GetObjectByOffset(int offset)
{
return Dynamic_GetDynamicByOffset(this, offset);
}
#pragma deprecated Use .SetDynamicByOffset() instead
public void SetObjectByOffset(int offset, Dynamic value)
{
Dynamic_SetDynamicByOffset(this, offset, value);
}
#pragma deprecated Use .PushDynamic() instead
public int PushObject(Dynamic value, const char[] name="")
{
return Dynamic_PushDynamic(this, value, name);
}
#pragma deprecated Use .GetDynamicByIndex() instead
public Dynamic GetObjectByIndex(int index)
{
return Dynamic_GetDynamicByIndex(this, index);
}
#pragma deprecated Use .SetDynamicByIndex() instead
public bool SetObjectByIndex(int index, Dynamic value)
{
return Dynamic_SetDynamicByIndex(this, index, value);
}
public Dynamic GetDynamic(const char[] membername)
{
return Dynamic_GetDynamic(this, membername);
}
public int SetDynamic(const char[] membername, Dynamic value)
{
return Dynamic_SetDynamic(this, membername, value);
}
public Dynamic GetDynamicByOffset(int offset)
{
return Dynamic_GetDynamicByOffset(this, offset);
}
public void SetDynamicByOffset(int offset, Dynamic value)
{
Dynamic_SetDynamicByOffset(this, offset, value);
}
public int PushDynamic(Dynamic value, const char[] name="")
{
return Dynamic_PushDynamic(this, value, name);
}
public Dynamic GetDynamicByIndex(int index)
{
return Dynamic_GetDynamicByIndex(this, index);
}
public bool SetDynamicByIndex(int index, Dynamic value)
{
return Dynamic_SetDynamicByIndex(this, index, value);
}
public Handle GetHandle(const char[] membername)
{
return Dynamic_GetHandle(this, membername);
}
public int SetHandle(const char[] membername, Handle value)
{
return Dynamic_SetHandle(this, membername, value);
}
public Handle GetHandleByOffset(int offset)
{
return Dynamic_GetHandleByOffset(this, offset);
}
public void SetHandleByOffset(int offset, Handle value)
{
Dynamic_SetHandleByOffset(this, offset, value);
}
public int PushHandle(Handle value, const char[] name="")
{
return Dynamic_PushHandle(this, value, name);
}
public Handle GetHandleByIndex(int index)
{
return Dynamic_GetHandleByIndex(this, index);
}
public bool GetVector(const char[] membername, float value[3])
{
return Dynamic_GetVector(this, membername, value);
}
public int SetVector(const char[] membername, const float value[3])
{
return Dynamic_SetVector(this, membername, value);
}
public bool GetVectorByOffset(int offset, float[3] value)
{
return Dynamic_GetVectorByOffset(this, offset, value);
}
public void SetVectorByOffset(int offset, const float[3] value)
{
Dynamic_SetVectorByOffset(this, offset, value);
}
public int PushVector(const float value[3], const char[] name="")
{
return Dynamic_PushVector(this, value, name);
}
public bool GetVectorByIndex(int index, float[3] value)
{
return Dynamic_GetVectorByIndex(this, index, value);
}
public void HookChanges(Dynamic_HookType callback)
{
Dynamic_HookChanges(this, callback);
}
public void UnHookChanges(Dynamic_HookType callback)
{
Dynamic_UnHookChanges(this, callback);
}
public int CallbackCount()
{
return Dynamic_CallbackCount(this);
}
public int GetMemberOffset(const char[] membername)
{
return Dynamic_GetMemberOffset(this, membername);
}
public Dynamic_MemberType GetMemberType(int offset)
{
return Dynamic_GetMemberTypeByOffset(this, offset);
}
public bool GetMemberNameByIndex(int index, char[] buffer, int length)
{
return Dynamic_GetMemberNameByIndex(this, index, buffer, length);
}
public int GetMemberOffsetByIndex(int index)
{
return Dynamic_GetMemberOffsetByIndex(this, index);
}
public bool GetMemberNameByOffset(int offset, char[] buffer, int length)
{
return Dynamic_GetMemberNameByOffset(this, offset, buffer, length);
}
public bool SortMembers(SortOrder order = Sort_Ascending)
{
return Dynamic_SortMembers(this, order);
}
public ArrayList FindByMemberValue(Dynamic params)
{
return Dynamic_FindByMemberValue(this, params);
}
}
#include <dynamic-collection>
#if !defined dynamic_use_local_methodmap
#include <dynamic-basic>
#endif
#if !defined REQUIRE_PLUGIN
public __pl_dynamic_SetNTVOptional()
{
MarkNativeAsOptional("Dynamic_Initialise");
MarkNativeAsOptional("Dynamic_IsValid");
MarkNativeAsOptional("Dynamic_Dispose");
MarkNativeAsOptional("Dynamic_ResetObject");
MarkNativeAsOptional("Dynamic_GetOwnerPlugin");
MarkNativeAsOptional("Dynamic_SetName");
MarkNativeAsOptional("Dynamic_FindByName");
MarkNativeAsOptional("Dynamic_GetParent");
MarkNativeAsOptional("Dynamic_GetName");
MarkNativeAsOptional("Dynamic_GetPersistence");
MarkNativeAsOptional("Dynamic_SetPersistence");
MarkNativeAsOptional("Dynamic_ReadConfig");
MarkNativeAsOptional("Dynamic_WriteConfig");
MarkNativeAsOptional("Dynamic_ReadKeyValues");
MarkNativeAsOptional("Dynamic_WriteKeyValues");
MarkNativeAsOptional("Dynamic_GetInt");
MarkNativeAsOptional("Dynamic_SetInt");
MarkNativeAsOptional("Dynamic_GetIntByOffset");
MarkNativeAsOptional("Dynamic_SetIntByOffset");
MarkNativeAsOptional("Dynamic_PushInt");
MarkNativeAsOptional("Dynamic_GetIntByIndex");
MarkNativeAsOptional("Dynamic_GetBool");
MarkNativeAsOptional("Dynamic_SetBool");
MarkNativeAsOptional("Dynamic_GetBoolByOffset");
MarkNativeAsOptional("Dynamic_SetBoolByOffset");
MarkNativeAsOptional("Dynamic_PushBool");
MarkNativeAsOptional("Dynamic_GetBoolByIndex");
MarkNativeAsOptional("Dynamic_GetFloat");
MarkNativeAsOptional("Dynamic_SetFloat");
MarkNativeAsOptional("Dynamic_GetFloatByOffset");
MarkNativeAsOptional("Dynamic_SetFloatByOffset");
MarkNativeAsOptional("Dynamic_PushFloat");
MarkNativeAsOptional("Dynamic_GetFloatByIndex");
MarkNativeAsOptional("Dynamic_GetString");
MarkNativeAsOptional("Dynamic_SetString");
MarkNativeAsOptional("Dynamic_GetStringByOffset");
MarkNativeAsOptional("Dynamic_SetStringByOffset");
MarkNativeAsOptional("Dynamic_PushString");
MarkNativeAsOptional("Dynamic_GetStringByIndex");
MarkNativeAsOptional("Dynamic_GetStringLength");
MarkNativeAsOptional("Dynamic_GetStringLengthByOffset");
MarkNativeAsOptional("Dynamic_CompareString");
MarkNativeAsOptional("Dynamic_GetObject");
MarkNativeAsOptional("Dynamic_SetObject");
MarkNativeAsOptional("Dynamic_GetObjectByOffset");
MarkNativeAsOptional("Dynamic_SetObjectByOffset");
MarkNativeAsOptional("Dynamic_PushObject");
MarkNativeAsOptional("Dynamic_GetObjectByIndex");
MarkNativeAsOptional("Dynamic_SetObjectByIndex");
MarkNativeAsOptional("Dynamic_GetDynamic");
MarkNativeAsOptional("Dynamic_SetDynamic");
MarkNativeAsOptional("Dynamic_GetDynamicByOffset");
MarkNativeAsOptional("Dynamic_SetDynamicByOffset");
MarkNativeAsOptional("Dynamic_PushDynamic");
MarkNativeAsOptional("Dynamic_GetDynamicByIndex");
MarkNativeAsOptional("Dynamic_SetDynamicByIndex");
MarkNativeAsOptional("Dynamic_GetHandle");
MarkNativeAsOptional("Dynamic_SetHandle");
MarkNativeAsOptional("Dynamic_GetHandleByOffset");
MarkNativeAsOptional("Dynamic_SetHandleByOffset");
MarkNativeAsOptional("Dynamic_PushHandle");
MarkNativeAsOptional("Dynamic_GetHandleByIndex");
MarkNativeAsOptional("Dynamic_GetVector");
MarkNativeAsOptional("Dynamic_SetVector");
MarkNativeAsOptional("Dynamic_GetVectorByOffset");
MarkNativeAsOptional("Dynamic_SetVectorByOffset");
MarkNativeAsOptional("Dynamic_PushVector");
MarkNativeAsOptional("Dynamic_GetVectorByIndex");
MarkNativeAsOptional("Dynamic_GetCollectionSize");
MarkNativeAsOptional("Dynamic_GetMemberCount");
MarkNativeAsOptional("Dynamic_HookChanges");
MarkNativeAsOptional("Dynamic_UnHookChanges");
MarkNativeAsOptional("Dynamic_CallbackCount");
MarkNativeAsOptional("Dynamic_GetMemberOffset");
MarkNativeAsOptional("Dynamic_GetMemberOffsetByIndex");
MarkNativeAsOptional("Dynamic_GetMemberType");
MarkNativeAsOptional("Dynamic_GetMemberTypeByOffset");
MarkNativeAsOptional("Dynamic_GetMemberNameByIndex");
MarkNativeAsOptional("Dynamic_GetMemberNameByOffset");
MarkNativeAsOptional("Dynamic_SortMembers");
MarkNativeAsOptional("Dynamic_FindByMemberValue");
}
#endif
public SharedPlugin __pl_dynamic =
{
name = "dynamic",
file = "dynamic.smx",
#if defined REQUIRE_PLUGIN
required = 1,
#else
required = 0,
#endif
};

View File

@ -20,7 +20,6 @@
#include <sourcemod>
#include <cstrike>
#include <dynamic>
#undef REQUIRE_PLUGIN
#include <basecomm>

View File

@ -23,7 +23,6 @@
#include <sdktools>
#include <geoip>
#include <clientprefs>
#include <dynamic>
#undef REQUIRE_PLUGIN
#include <adminmenu>
@ -1333,56 +1332,55 @@ bool LoadStyles()
char[] sPath = new char[PLATFORM_MAX_PATH];
BuildPath(Path_SM, sPath, PLATFORM_MAX_PATH, "configs/shavit-styles.cfg");
Dynamic dStylesConfig = Dynamic();
if(!dStylesConfig.ReadKeyValues(sPath))
KeyValues kv = new KeyValues("shavit-styles");
if(!kv.ImportFromFile(sPath) || !kv.GotoFirstSubKey())
{
dStylesConfig.Dispose();
delete kv;
return false;
}
gI_Styles = dStylesConfig.MemberCount;
int i = 0;
for(int i = 0; i < gI_Styles; i++)
do
{
Dynamic dStyle = dStylesConfig.GetDynamicByIndex(i);
dStyle.GetString("name", gS_StyleStrings[i][sStyleName], 128);
dStyle.GetString("shortname", gS_StyleStrings[i][sShortName], 128);
dStyle.GetString("htmlcolor", gS_StyleStrings[i][sHTMLColor], 128);
dStyle.GetString("command", gS_StyleStrings[i][sChangeCommand], 128);
dStyle.GetString("clantag", gS_StyleStrings[i][sClanTag], 128);
kv.GetString("name", gS_StyleStrings[i][sStyleName], 128, "<MISSING STYLE NAME>");
kv.GetString("shortname", gS_StyleStrings[i][sShortName], 128, "<MISSING SHORT STYLE NAME>");
kv.GetString("htmlcolor", gS_StyleStrings[i][sHTMLColor], 128, "<MISSING STYLE HTML COLOR>");
kv.GetString("command", gS_StyleStrings[i][sChangeCommand], 128, "");
kv.GetString("clantag", gS_StyleStrings[i][sClanTag], 128, "<MISSING STYLE CLAN TAG>");
gA_StyleSettings[i][bAutobhop] = dStyle.GetBool("autobhop", true);
gA_StyleSettings[i][bEasybhop] = dStyle.GetBool("easybhop", true);
gA_StyleSettings[i][bPrespeed] = dStyle.GetBool("prespeed", false);
gA_StyleSettings[i][fVelocityLimit] = dStyle.GetFloat("velocity_limit", 0.0);
gA_StyleSettings[i][iAiraccelerate] = dStyle.GetInt("airaccelerate", 1000);
gA_StyleSettings[i][fRunspeed] = dStyle.GetFloat("runspeed", 260.00);
gA_StyleSettings[i][fGravityMultiplier] = dStyle.GetFloat("gravity", 1.0);
gA_StyleSettings[i][fSpeedMultiplier] = dStyle.GetFloat("speed", 1.0);
gA_StyleSettings[i][bHalftime] = dStyle.GetBool("halftime", false);
gA_StyleSettings[i][fVelocity] = dStyle.GetFloat("velocity", 1.0);
gA_StyleSettings[i][fBonusVelocity] = dStyle.GetFloat("bonus_velocity", 0.0);
gA_StyleSettings[i][fMinVelocity] = dStyle.GetFloat("min_velocity", 0.0);
gA_StyleSettings[i][bBlockW] = dStyle.GetBool("block_w", false);
gA_StyleSettings[i][bBlockA] = dStyle.GetBool("block_a", false);
gA_StyleSettings[i][bBlockS] = dStyle.GetBool("block_s", false);
gA_StyleSettings[i][bBlockD] = dStyle.GetBool("block_d", false);
gA_StyleSettings[i][bBlockUse] = dStyle.GetBool("block_use", false);
gA_StyleSettings[i][iForceHSW] = dStyle.GetInt("force_hsw", 0);
gA_StyleSettings[i][bBlockPLeft] = dStyle.GetBool("block_pleft", false);
gA_StyleSettings[i][bBlockPRight] = dStyle.GetBool("block_pright", false);
gA_StyleSettings[i][bBlockPStrafe] = dStyle.GetBool("block_pstrafe", false);
gA_StyleSettings[i][bUnranked] = dStyle.GetBool("unranked", false);
gA_StyleSettings[i][bNoReplay] = dStyle.GetBool("noreplay", false);
gA_StyleSettings[i][bSync] = dStyle.GetBool("sync", true);
gA_StyleSettings[i][bStrafeCountW] = dStyle.GetBool("strafe_count_w", false);
gA_StyleSettings[i][bStrafeCountA] = dStyle.GetBool("strafe_count_a", true);
gA_StyleSettings[i][bStrafeCountS] = dStyle.GetBool("strafe_count_s", false);
gA_StyleSettings[i][bStrafeCountD] = dStyle.GetBool("strafe_count_d", true);
gA_StyleSettings[i][fRankingMultiplier] = dStyle.GetFloat("rankingmultiplier", 1.00);
gA_StyleSettings[i][iSpecial] = dStyle.GetInt("special", 0);
gA_StyleSettings[i][bAutobhop] = view_as<bool>(kv.GetNum("autobhop", 1));
gA_StyleSettings[i][bEasybhop] = view_as<bool>(kv.GetNum("easybhop", 1));
gA_StyleSettings[i][bPrespeed] = view_as<bool>(kv.GetNum("prespeed", 0));
gA_StyleSettings[i][fVelocityLimit] = kv.GetFloat("velocity_limit", 0.0);
gA_StyleSettings[i][iAiraccelerate] = kv.GetNum("airaccelerate", 1000);
gA_StyleSettings[i][fRunspeed] = kv.GetFloat("runspeed", 260.00);
gA_StyleSettings[i][fGravityMultiplier] = kv.GetFloat("gravity", 1.0);
gA_StyleSettings[i][fSpeedMultiplier] = kv.GetFloat("speed", 1.0);
gA_StyleSettings[i][bHalftime] = view_as<bool>(kv.GetNum("halftime", 0));
gA_StyleSettings[i][fVelocity] = kv.GetFloat("velocity", 1.0);
gA_StyleSettings[i][fBonusVelocity] = kv.GetFloat("bonus_velocity", 0.0);
gA_StyleSettings[i][fMinVelocity] = kv.GetFloat("min_velocity", 0.0);
gA_StyleSettings[i][bBlockW] = view_as<bool>(kv.GetNum("block_w", 0));
gA_StyleSettings[i][bBlockA] = view_as<bool>(kv.GetNum("block_a", 0));
gA_StyleSettings[i][bBlockS] = view_as<bool>(kv.GetNum("block_s", 0));
gA_StyleSettings[i][bBlockD] = view_as<bool>(kv.GetNum("block_d", 0));
gA_StyleSettings[i][bBlockUse] = view_as<bool>(kv.GetNum("block_use", 0));
gA_StyleSettings[i][iForceHSW] = kv.GetNum("force_hsw", 0);
gA_StyleSettings[i][bBlockPLeft] = view_as<bool>(kv.GetNum("block_pleft", 0));
gA_StyleSettings[i][bBlockPRight] = view_as<bool>(kv.GetNum("block_pright", 0));
gA_StyleSettings[i][bBlockPStrafe] = view_as<bool>(kv.GetNum("block_pstrafe", 0));
gA_StyleSettings[i][bUnranked] = view_as<bool>(kv.GetNum("unranked", 0));
gA_StyleSettings[i][bNoReplay] = view_as<bool>(kv.GetNum("noreplay", 0));
gA_StyleSettings[i][bSync] = view_as<bool>(kv.GetNum("sync", 1));
gA_StyleSettings[i][bStrafeCountW] = view_as<bool>(kv.GetNum("strafe_count_w", false));
gA_StyleSettings[i][bStrafeCountA] = view_as<bool>(kv.GetNum("strafe_count_a", 1));
gA_StyleSettings[i][bStrafeCountS] = view_as<bool>(kv.GetNum("strafe_count_s", false));
gA_StyleSettings[i][bStrafeCountD] = view_as<bool>(kv.GetNum("strafe_count_d", 1));
gA_StyleSettings[i][fRankingMultiplier] = kv.GetFloat("rankingmultiplier", 1.00);
gA_StyleSettings[i][iSpecial] = kv.GetNum("special", 0);
if(!gB_Registered && strlen(gS_StyleStrings[i][sChangeCommand]) > 0)
{
@ -1405,11 +1403,16 @@ bool LoadStyles()
RegConsoleCmd(sCommand, Command_StyleChange, sDescription);
}
}
i++;
}
gB_Registered = true;
while(kv.GotoNextKey());
dStylesConfig.Dispose(true);
delete kv;
gI_Styles = i;
gB_Registered = true;
return true;
}
@ -1436,24 +1439,25 @@ bool LoadMessages()
char[] sPath = new char[PLATFORM_MAX_PATH];
BuildPath(Path_SM, sPath, PLATFORM_MAX_PATH, "configs/shavit-messages.cfg");
Dynamic dMessagesConfig = Dynamic();
if(!dMessagesConfig.ReadKeyValues(sPath))
KeyValues kv = new KeyValues("shavit-messages");
if(!kv.ImportFromFile(sPath))
{
dMessagesConfig.Dispose();
delete kv;
return false;
}
Dynamic dMessage = dMessagesConfig.GetDynamic((gEV_Type == Engine_CSS)? "CS:S":"CS:GO");
dMessage.GetString("prefix", gS_ChatStrings[sMessagePrefix], 128);
dMessage.GetString("text", gS_ChatStrings[sMessageText], 128);
dMessage.GetString("warning", gS_ChatStrings[sMessageWarning], 128);
dMessage.GetString("variable", gS_ChatStrings[sMessageVariable], 128);
dMessage.GetString("variable2", gS_ChatStrings[sMessageVariable2], 128);
dMessage.GetString("style", gS_ChatStrings[sMessageStyle], 128);
kv.JumpToKey((gEV_Type == Engine_CSS)? "CS:S":"CS:GO");
dMessagesConfig.Dispose(true);
kv.GetString("prefix", gS_ChatStrings[sMessagePrefix], 128, "\x075e70d0[Timer]");
kv.GetString("text", gS_ChatStrings[sMessageText], 128, "\x07ffffff");
kv.GetString("warning", gS_ChatStrings[sMessageWarning], 128, "\x07af2a22");
kv.GetString("variable", gS_ChatStrings[sMessageVariable], 128, "\x077fd772");
kv.GetString("variable2", gS_ChatStrings[sMessageVariable2], 128, "\x07276f5c");
kv.GetString("style", gS_ChatStrings[sMessageStyle], 128, "\x07db88c2");
delete kv;
for(int i = 0; i < CHATSETTINGS_SIZE; i++)
{

View File

@ -22,7 +22,6 @@
#include <cstrike>
#include <sdktools>
#include <sdkhooks>
#include <dynamic>
#include <clientprefs>
#undef REQUIRE_EXTENSIONS
@ -495,24 +494,19 @@ bool LoadAdvertisementsConfig()
char[] sPath = new char[PLATFORM_MAX_PATH];
BuildPath(Path_SM, sPath, PLATFORM_MAX_PATH, "configs/shavit-advertisements.cfg");
Dynamic dAdvertisements = Dynamic();
if(!dAdvertisements.ReadKeyValues(sPath))
KeyValues kv = new KeyValues("shavit-advertisements");
if(!kv.ImportFromFile(sPath) || !kv.GotoFirstSubKey(false))
{
dAdvertisements.Dispose();
delete kv;
return false;
}
int iCount = dAdvertisements.MemberCount;
for(int i = 0; i < iCount; i++)
do
{
char[] sID = new char[4];
IntToString(i, sID, 4);
char[] sTempMessage = new char[300];
dAdvertisements.GetString(sID, sTempMessage, 300);
kv.GetString(NULL_STRING, sTempMessage, 300, "<EMPTY ADVERTISEMENT>");
ReplaceString(sTempMessage, 300, "{text}", gS_ChatStrings[sMessageText]);
ReplaceString(sTempMessage, 300, "{warning}", gS_ChatStrings[sMessageWarning]);
@ -523,7 +517,9 @@ bool LoadAdvertisementsConfig()
gA_Advertisements.PushString(sTempMessage);
}
dAdvertisements.Dispose(true);
while(kv.GotoNextKey(false));
delete kv;
return true;
}
@ -786,6 +782,13 @@ void RemoveRagdoll(int client)
public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float vel[3], float angles[3], TimerStatus status)
{
bool bNoclip = (GetEntityMoveType(client) == MOVETYPE_NOCLIP);
if(bNoclip && status == Timer_Running)
{
Shavit_StopTimer(client);
}
int iGroundEntity = GetEntPropEnt(client, Prop_Send, "m_hGroundEntity");
// prespeed
@ -809,7 +812,7 @@ public Action Shavit_OnUserCmdPre(int client, int &buttons, int &impulse, float
float speed_New = (SquareRoot(Pow(speed[0], 2.0) + Pow(speed[1], 2.0)));
float fScale = (gF_PrespeedLimit / speed_New);
if(GetEntityMoveType(client) == MOVETYPE_NOCLIP)
if(bNoclip)
{
speed[2] = 0.0;
}
@ -1534,6 +1537,11 @@ public Action Command_Noclip(int client, int args)
if(GetEntityMoveType(client) != MOVETYPE_NOCLIP)
{
if(Shavit_GetTimerStatus(client) != Timer_Stopped)
{
Shavit_StopTimer(client);
}
SetEntityMoveType(client, MOVETYPE_NOCLIP);
}
@ -1554,6 +1562,11 @@ public Action CommandListener_Noclip(int client, const char[] command, int args)
if((gI_NoclipMe == 1 || (gI_NoclipMe == 2 && CheckCommandAccess(client, "noclipme", ADMFLAG_CHEATS))) && command[0] == '+')
{
if(Shavit_GetTimerStatus(client) != Timer_Stopped)
{
Shavit_StopTimer(client);
}
SetEntityMoveType(client, MOVETYPE_NOCLIP);
}

View File

@ -22,7 +22,6 @@
#include <cstrike>
#include <sdktools>
#include <sdkhooks>
#include <dynamic>
#undef REQUIRE_PLUGIN
#include <shavit>
@ -313,23 +312,23 @@ bool LoadStyling()
char[] sPath = new char[PLATFORM_MAX_PATH];
BuildPath(Path_SM, sPath, PLATFORM_MAX_PATH, "configs/shavit-replay.cfg");
Dynamic dReplayConfig = Dynamic();
if(!dReplayConfig.ReadKeyValues(sPath))
KeyValues kv = new KeyValues("shavit-replay");
if(!kv.ImportFromFile(sPath))
{
dReplayConfig.Dispose();
delete kv;
return false;
}
dReplayConfig.GetString("clantag", gS_ReplayStrings[sReplayClanTag], MAX_NAME_LENGTH);
dReplayConfig.GetString("namestyle", gS_ReplayStrings[sReplayNameStyle], MAX_NAME_LENGTH);
dReplayConfig.GetString("centralname", gS_ReplayStrings[sReplayCentralName], MAX_NAME_LENGTH);
dReplayConfig.GetString("centralstyle", gS_ReplayStrings[sReplayCentralStyle], MAX_NAME_LENGTH);
dReplayConfig.GetString("centralstyletag", gS_ReplayStrings[sReplayCentralStyleTag], MAX_NAME_LENGTH);
dReplayConfig.GetString("unloaded", gS_ReplayStrings[sReplayUnloaded], MAX_NAME_LENGTH);
kv.GetString("clantag", gS_ReplayStrings[sReplayClanTag], MAX_NAME_LENGTH, "<EMPTY CLANTAG>");
kv.GetString("namestyle", gS_ReplayStrings[sReplayNameStyle], MAX_NAME_LENGTH, "<EMPTY NAMESTYLE>");
kv.GetString("centralname", gS_ReplayStrings[sReplayCentralName], MAX_NAME_LENGTH, "<EMPTY CENTRALNAME>");
kv.GetString("centralstyle", gS_ReplayStrings[sReplayCentralStyle], MAX_NAME_LENGTH, "<EMPTY CENTRALSTYLE>");
kv.GetString("centralstyletag", gS_ReplayStrings[sReplayCentralStyleTag], MAX_NAME_LENGTH, "<EMPTY CENTRALSTYLETAG>");
kv.GetString("unloaded", gS_ReplayStrings[sReplayUnloaded], MAX_NAME_LENGTH, "<EMPTY UNLOADED>");
dReplayConfig.Dispose();
delete kv;
return true;
}

View File

@ -22,7 +22,6 @@
#include <sdktools>
#include <sdkhooks>
#include <cstrike>
#include <dynamic>
#undef REQUIRE_PLUGIN
#include <shavit>
@ -393,23 +392,23 @@ bool LoadZonesConfig()
char[] sPath = new char[PLATFORM_MAX_PATH];
BuildPath(Path_SM, sPath, PLATFORM_MAX_PATH, "configs/shavit-zones.cfg");
Dynamic dZones = Dynamic();
if(!dZones.ReadKeyValues(sPath))
KeyValues kv = new KeyValues("shavit-zones");
if(!kv.ImportFromFile(sPath))
{
dZones.Dispose();
delete kv;
return false;
}
Dynamic dSprites = dZones.GetDynamicByIndex((gEV_Type == Engine_CSS)? 0:1);
dSprites.GetString("beam", gS_Sprites[sBeamSprite], PLATFORM_MAX_PATH);
dSprites.GetString("halo", gS_Sprites[sHaloSprite], PLATFORM_MAX_PATH);
kv.JumpToKey((gEV_Type == Engine_CSS)? "CS:S":"CS:GO");
kv.GetString("beam", gS_Sprites[sBeamSprite], PLATFORM_MAX_PATH);
kv.GetString("halo", gS_Sprites[sHaloSprite], PLATFORM_MAX_PATH);
char[] sDownloads = new char[PLATFORM_MAX_PATH * 8];
dSprites.GetString("downloads", sDownloads, PLATFORM_MAX_PATH * 8);
kv.GetString("downloads", sDownloads, (PLATFORM_MAX_PATH * 8));
char[][] sDownloadsExploded = new char[PLATFORM_MAX_PATH][PLATFORM_MAX_PATH]; // we don't need more than 8 sprites ever
char[][] sDownloadsExploded = new char[PLATFORM_MAX_PATH][PLATFORM_MAX_PATH];
int iDownloads = ExplodeString(sDownloads, ";", sDownloadsExploded, PLATFORM_MAX_PATH, PLATFORM_MAX_PATH, false);
for(int i = 0; i < iDownloads; i++)
@ -421,21 +420,27 @@ bool LoadZonesConfig()
}
}
Dynamic dColors = dZones.GetDynamicByIndex(2);
int iCount = dColors.MemberCount;
kv.GoBack();
kv.JumpToKey("Colors");
kv.JumpToKey("Start"); // A stupid and hacky way to achieve what I want. It works though.
for(int i = 0; i < iCount; i++)
int i = 0;
do
{
Dynamic dZoneSettings = dColors.GetDynamicByIndex(i);
gA_ZoneSettings[i][bVisible] = dZoneSettings.GetBool("visible", true);
gA_ZoneSettings[i][iRed] = dZoneSettings.GetInt("red", 255);
gA_ZoneSettings[i][iGreen] = dZoneSettings.GetInt("green", 255);
gA_ZoneSettings[i][iBlue] = dZoneSettings.GetInt("blue", 255);
gA_ZoneSettings[i][iAlpha] = dZoneSettings.GetInt("alpha", 255);
gA_ZoneSettings[i][fWidth] = dZoneSettings.GetFloat("width", 2.0);
gA_ZoneSettings[i][bVisible] = view_as<bool>(kv.GetNum("visible", 1));
gA_ZoneSettings[i][iRed] = kv.GetNum("red", 255);
gA_ZoneSettings[i][iGreen] = kv.GetNum("green", 255);
gA_ZoneSettings[i][iBlue] = kv.GetNum("blue", 255);
gA_ZoneSettings[i][iAlpha] = kv.GetNum("alpha", 255);
gA_ZoneSettings[i][fWidth] = kv.GetFloat("width", 2.0);
i++;
}
dZones.Dispose(true);
while(kv.GotoNextKey(false));
delete kv;
return true;
}