Increased HP of Practice Dummy. Added instanced player room with persistent storage in Inn. Full compile. Updated release archive.
495 lines
18 KiB
Plaintext
495 lines
18 KiB
Plaintext
/*
|
|
Examine NUI Windows
|
|
Created By: Daz
|
|
*/
|
|
|
|
#include "inc_nui"
|
|
#include "inc_util"
|
|
|
|
const string EXAMINE_NUI_WINDOW_ID = "EXAMINEWINDOW";
|
|
const string EXAMINE_WINDOW_GEOMETRY_JSON = "EXAMINE_WINDOW_GEOMETRY_JSON";
|
|
const string EXAMINE_GENERIC_WINDOW_JSON = "EXAMINE_GENERIC_WINDOW_JSON";
|
|
const string EXAMINE_ITEM_WINDOW_JSON = "EXAMINE_ITEM_WINDOW_JSON";
|
|
|
|
const string EXAMINE_CURRENT_WINDOW_TYPE = "EXAMINE_CURRENT_WINDOW_TYPE";
|
|
const string EXAMINE_CURRENT_OBJECT = "EXAMINE_CURRENT_OBJECT";
|
|
|
|
const float EXAMINE_GENERIC_WINDOW_WIDTH = 500.0f;
|
|
const float EXAMINE_GENERIC_WINDOW_HEIGHT = 255.0f;
|
|
|
|
const float EXAMINE_ITEM_WINDOW_WIDTH = 500.0f;
|
|
const float EXAMINE_ITEM_WINDOW_HEIGHT = 400.0f;
|
|
|
|
void Examine_DisablePanels(object oPlayer);
|
|
json Examine_GetWindowJson(int nPanel);
|
|
json Examine_GetGenericWindowJson();
|
|
json Examine_GetItemWindowJson();
|
|
float Examine_GetWindowWidth(int nPanel);
|
|
float Examine_GetWindowHeight(int nPanel);
|
|
|
|
void Examine_HandleGUIEvents(object oPlayer, object oTarget, int nPanel);
|
|
void Examine_HandleNUIEvents(object oPlayer, int nToken, string sType, string sElement, int nArrayIndex);
|
|
|
|
void Examine_SetData(object oPlayer, int nToken, object oTarget, int nPanel);
|
|
void Examine_SetGenericData(object oPlayer, int nToken, object oTarget, int nPanel);
|
|
string Examine_GetItemPropertyString(itemproperty ip);
|
|
void Examine_SetItemData(object oPlayer, int nToken, object oItem);
|
|
|
|
|
|
void Examine_DisablePanels(object oPlayer)
|
|
{
|
|
SetGuiPanelDisabled(oPlayer, GUI_PANEL_EXAMINE_CREATURE, TRUE);
|
|
SetGuiPanelDisabled(oPlayer, GUI_PANEL_EXAMINE_ITEM, TRUE);
|
|
SetGuiPanelDisabled(oPlayer, GUI_PANEL_EXAMINE_PLACEABLE, TRUE);
|
|
SetGuiPanelDisabled(oPlayer, GUI_PANEL_EXAMINE_DOOR, TRUE);
|
|
}
|
|
|
|
json Examine_GetWindowJson(int nPanel)
|
|
{
|
|
json jWindow;
|
|
switch (nPanel)
|
|
{
|
|
case GUI_PANEL_EXAMINE_CREATURE:
|
|
case GUI_PANEL_EXAMINE_PLACEABLE:
|
|
case GUI_PANEL_EXAMINE_DOOR:
|
|
jWindow = Examine_GetGenericWindowJson();
|
|
break;
|
|
case GUI_PANEL_EXAMINE_ITEM:
|
|
jWindow = Examine_GetItemWindowJson();
|
|
break;
|
|
}
|
|
|
|
return jWindow;
|
|
}
|
|
|
|
json Examine_GetGenericWindowJson()
|
|
{
|
|
json jRoot = GetLocalJson(GetModule(), EXAMINE_GENERIC_WINDOW_JSON);
|
|
if (jRoot == JsonNull())
|
|
{
|
|
json jCol = JsonArray(), jRow;
|
|
jRow = JsonArray();
|
|
{
|
|
json jSubCol, jSubRow;
|
|
|
|
jSubCol = JsonArray();
|
|
// Image
|
|
jSubRow = JsonArray();
|
|
{
|
|
json jImage = NuiImage(NuiBind("image_1"), JsonInt(NUI_ASPECT_EXACTSCALED), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_TOP));
|
|
jImage = NuiWidth(jImage, 64.0f);
|
|
jImage = NuiHeight(jImage, 100.0f);
|
|
jSubRow = JsonArrayInsert(jSubRow, jImage);
|
|
}
|
|
jSubCol = NuiInsertRow(jSubCol, jSubRow);
|
|
|
|
// Spacer
|
|
jSubRow = JsonArray();
|
|
{
|
|
jSubRow = JsonArrayInsert(jSubRow, NuiSpacer());
|
|
}
|
|
jSubCol = NuiInsertRow(jSubCol, jSubRow);
|
|
jRow = JsonArrayInsert(jRow, NuiCol(jSubCol));
|
|
|
|
jSubCol = JsonArray();
|
|
// Description Label
|
|
jSubRow = JsonArray();
|
|
{
|
|
json jHeader = NuiHeader(JsonString("Description"));
|
|
jSubRow = JsonArrayInsert(jSubRow, jHeader);
|
|
}
|
|
jSubCol = NuiInsertRow(jSubCol, jSubRow);
|
|
|
|
// Description Text
|
|
jSubRow = JsonArray();
|
|
{
|
|
json jDescription = NuiText(NuiBind("description"));
|
|
jDescription = NuiHeight(jDescription, 160.0f);
|
|
jSubRow = JsonArrayInsert(jSubRow, jDescription);
|
|
}
|
|
jSubCol = NuiInsertRow(jSubCol, jSubRow);
|
|
|
|
// Spacer
|
|
jSubRow = JsonArray();
|
|
{
|
|
jSubRow = JsonArrayInsert(jSubRow, NuiSpacer());
|
|
}
|
|
jSubCol = NuiInsertRow(jSubCol, jSubRow);
|
|
jRow = JsonArrayInsert(jRow, NuiCol(jSubCol));
|
|
}
|
|
jCol = NuiInsertRow(jCol, jRow);
|
|
|
|
jRoot = NuiCol(jCol);
|
|
SetLocalJson(GetModule(), EXAMINE_GENERIC_WINDOW_JSON, jRoot);
|
|
}
|
|
|
|
return jRoot;
|
|
}
|
|
|
|
json Examine_GetItemWindowJson()
|
|
{
|
|
json jRoot = GetLocalJson(GetModule(), EXAMINE_ITEM_WINDOW_JSON);
|
|
if (jRoot == JsonNull())
|
|
{
|
|
json jCol = JsonArray(), jRow;
|
|
jRow = JsonArray();
|
|
{
|
|
json jSubCol, jSubRow;
|
|
|
|
jSubCol = JsonArray();
|
|
// Image
|
|
jSubRow = JsonArray();
|
|
{
|
|
json jImage = NuiImage(NuiBind("image_1"), JsonInt(NUI_ASPECT_EXACTSCALED), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_TOP));
|
|
json jRect = NuiRect(0.0f, 0.0f, 64.0f, 192.0f);
|
|
json jDrawList = JsonArray();
|
|
jDrawList = JsonArrayInsert(jDrawList, NuiDrawListImage(NuiBind("complex_item"), NuiBind("image_2"), jRect, JsonInt(NUI_ASPECT_EXACTSCALED), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_TOP)));
|
|
jDrawList = JsonArrayInsert(jDrawList, NuiDrawListImage(NuiBind("complex_item"), NuiBind("image_3"), jRect, JsonInt(NUI_ASPECT_EXACTSCALED), JsonInt(NUI_HALIGN_CENTER), JsonInt(NUI_VALIGN_TOP)));
|
|
jImage = NuiDrawList(jImage, JsonBool(TRUE), jDrawList);
|
|
jImage = NuiWidth(jImage, 64.0f);
|
|
jImage = NuiHeight(jImage, 192.0f);
|
|
jSubRow = JsonArrayInsert(jSubRow, jImage);
|
|
}
|
|
jSubCol = NuiInsertRow(jSubCol, jSubRow);
|
|
|
|
// Button?
|
|
jSubRow = JsonArray();
|
|
{
|
|
json jButton = NuiButton(JsonString("Button?"));
|
|
jButton = NuiId(jButton, "btn_button");
|
|
jButton = NuiWidth(jButton, 64.0f);
|
|
jButton = NuiHeight(jButton, 35.0f);
|
|
jSubRow = JsonArrayInsert(jSubRow, jButton);
|
|
}
|
|
//jSubCol = NuiInsertRow(jSubCol, jSubRow);
|
|
|
|
// Spacer
|
|
jSubRow = JsonArray();
|
|
{
|
|
jSubRow = JsonArrayInsert(jSubRow, NuiSpacer());
|
|
}
|
|
jSubCol = NuiInsertRow(jSubCol, jSubRow);
|
|
jRow = JsonArrayInsert(jRow, NuiCol(jSubCol));
|
|
|
|
jSubCol = JsonArray();
|
|
// Description Label
|
|
jSubRow = JsonArray();
|
|
{
|
|
json jHeader = NuiHeader(JsonString("Description"));
|
|
jSubRow = JsonArrayInsert(jSubRow, jHeader);
|
|
}
|
|
jSubCol = NuiInsertRow(jSubCol, jSubRow);
|
|
|
|
// Description Text
|
|
jSubRow = JsonArray();
|
|
{
|
|
json jDescription = NuiText(NuiBind("description"));
|
|
jDescription = NuiHeight(jDescription, 160.0f);
|
|
jSubRow = JsonArrayInsert(jSubRow, jDescription);
|
|
}
|
|
jSubCol = NuiInsertRow(jSubCol, jSubRow);
|
|
|
|
// Item Properties Label
|
|
jSubRow = JsonArray();
|
|
{
|
|
json jHeader = NuiHeader(JsonString("Item Properties"));
|
|
jSubRow = JsonArrayInsert(jSubRow, jHeader);
|
|
}
|
|
jSubCol = NuiInsertRow(jSubCol, jSubRow);
|
|
|
|
// Item Properties List
|
|
jSubRow = JsonArray();
|
|
{
|
|
json jListTemplate = JsonArray();
|
|
{
|
|
json jLabel = NuiLabel(NuiBind("property"), JsonInt(NUI_HALIGN_LEFT), JsonInt(NUI_VALIGN_MIDDLE));
|
|
jLabel = NuiStyleForegroundColor(jLabel, NuiBind("color"));
|
|
jListTemplate = JsonArrayInsert(jListTemplate, NuiListTemplateCell(jLabel, 0.0f, TRUE));
|
|
}
|
|
json jList = NuiList(jListTemplate, NuiBind("property"), 16.0f);
|
|
jList = NuiHeight(jList, 105.0f);
|
|
jSubRow = JsonArrayInsert(jSubRow, jList);
|
|
}
|
|
jSubCol = NuiInsertRow(jSubCol, jSubRow);
|
|
|
|
// Spacer
|
|
jSubRow = JsonArray();
|
|
{
|
|
jSubRow = JsonArrayInsert(jSubRow, NuiSpacer());
|
|
}
|
|
jSubCol = NuiInsertRow(jSubCol, jSubRow);
|
|
jRow = JsonArrayInsert(jRow, NuiCol(jSubCol));
|
|
}
|
|
jCol = NuiInsertRow(jCol, jRow);
|
|
|
|
jRoot = NuiCol(jCol);
|
|
SetLocalJson(GetModule(), EXAMINE_ITEM_WINDOW_JSON, jRoot);
|
|
}
|
|
|
|
return jRoot;
|
|
}
|
|
|
|
float Examine_GetWindowWidth(int nPanel)
|
|
{
|
|
float fWidth;
|
|
switch (nPanel)
|
|
{
|
|
case GUI_PANEL_EXAMINE_CREATURE:
|
|
case GUI_PANEL_EXAMINE_PLACEABLE:
|
|
case GUI_PANEL_EXAMINE_DOOR:
|
|
fWidth = EXAMINE_GENERIC_WINDOW_WIDTH;
|
|
break;
|
|
case GUI_PANEL_EXAMINE_ITEM:
|
|
fWidth = EXAMINE_ITEM_WINDOW_WIDTH;
|
|
break;
|
|
}
|
|
|
|
return fWidth;
|
|
}
|
|
|
|
float Examine_GetWindowHeight(int nPanel)
|
|
{
|
|
float fHeight;
|
|
switch (nPanel)
|
|
{
|
|
case GUI_PANEL_EXAMINE_CREATURE:
|
|
case GUI_PANEL_EXAMINE_PLACEABLE:
|
|
case GUI_PANEL_EXAMINE_DOOR:
|
|
fHeight = EXAMINE_GENERIC_WINDOW_HEIGHT;
|
|
break;
|
|
case GUI_PANEL_EXAMINE_ITEM:
|
|
fHeight = EXAMINE_ITEM_WINDOW_HEIGHT;
|
|
break;
|
|
}
|
|
|
|
return fHeight;
|
|
}
|
|
|
|
void Examine_HandleGUIEvents(object oPlayer, object oTarget, int nPanel)
|
|
{
|
|
json jGeometry = GetLocalJson(oPlayer, EXAMINE_WINDOW_GEOMETRY_JSON);
|
|
|
|
int nToken = NuiFindWindow(oPlayer, EXAMINE_NUI_WINDOW_ID);
|
|
if (nToken)
|
|
{
|
|
if (GetLocalObject(oPlayer, EXAMINE_CURRENT_OBJECT) == oTarget)
|
|
return;
|
|
|
|
int bIsItemExamine = nPanel == GUI_PANEL_EXAMINE_ITEM;
|
|
int nCurrentWindowType = GetLocalInt(oPlayer, EXAMINE_CURRENT_WINDOW_TYPE);
|
|
|
|
if (bIsItemExamine && nCurrentWindowType != GUI_PANEL_EXAMINE_ITEM)
|
|
{
|
|
NuiSetGroupLayout(oPlayer, nToken, NUI_WINDOW_ROOT_GROUP, Examine_GetWindowJson(nPanel));
|
|
NuiSetBind(oPlayer, nToken, NUI_WINDOW_GEOMETRY_BIND, NuiSetRectHeight(jGeometry, Examine_GetWindowHeight(nPanel)));
|
|
}
|
|
else if (!bIsItemExamine && nCurrentWindowType == GUI_PANEL_EXAMINE_ITEM)
|
|
{
|
|
NuiSetGroupLayout(oPlayer, nToken, NUI_WINDOW_ROOT_GROUP, Examine_GetWindowJson(nPanel));
|
|
NuiSetBind(oPlayer, nToken, NUI_WINDOW_GEOMETRY_BIND, NuiSetRectHeight(jGeometry, Examine_GetWindowHeight(nPanel)));
|
|
}
|
|
|
|
Examine_SetData(oPlayer, nToken, oTarget, nPanel);
|
|
|
|
SetLocalInt(oPlayer, EXAMINE_CURRENT_WINDOW_TYPE, nPanel);
|
|
SetLocalObject(oPlayer, EXAMINE_CURRENT_OBJECT, oTarget);
|
|
|
|
return;
|
|
}
|
|
|
|
json jRoot = Examine_GetWindowJson(nPanel);
|
|
json jWindow = NuiWindow(jRoot, NuiBind(NUI_WINDOW_TITLE_BIND), NuiBind(NUI_WINDOW_GEOMETRY_BIND), JsonBool(FALSE), JsonNull(), JsonBool(TRUE), JsonBool(FALSE), JsonBool(TRUE));
|
|
|
|
float fWidth = Examine_GetWindowWidth(nPanel);
|
|
float fHeight = Examine_GetWindowHeight(nPanel);
|
|
|
|
if (jGeometry == JsonNull())
|
|
jGeometry = NuiGetCenteredGeometryRect(oPlayer, fWidth, fHeight);
|
|
else
|
|
{
|
|
jGeometry = NuiSetRectWidth(jGeometry, fWidth);
|
|
jGeometry = NuiSetRectHeight(jGeometry, fHeight);
|
|
}
|
|
|
|
nToken = NuiCreate(oPlayer, jWindow, EXAMINE_NUI_WINDOW_ID);
|
|
|
|
NuiSetBindWatch(oPlayer, nToken, NUI_WINDOW_GEOMETRY_BIND, TRUE);
|
|
NuiSetBind(oPlayer, nToken, NUI_WINDOW_GEOMETRY_BIND, jGeometry);
|
|
|
|
Examine_SetData(oPlayer, nToken, oTarget, nPanel);
|
|
|
|
SetLocalInt(oPlayer, EXAMINE_CURRENT_WINDOW_TYPE, nPanel);
|
|
SetLocalObject(oPlayer, EXAMINE_CURRENT_OBJECT, oTarget);
|
|
}
|
|
|
|
void Examine_HandleNUIEvents(object oPlayer, int nToken, string sType, string sElement, int nArrayIndex)
|
|
{
|
|
if (sType == NUI_EVENT_CLOSE)
|
|
{
|
|
DeleteLocalInt(oPlayer, EXAMINE_CURRENT_WINDOW_TYPE);
|
|
DeleteLocalObject(oPlayer, EXAMINE_CURRENT_OBJECT);
|
|
}
|
|
else if (sType == NUI_EVENT_WATCH)
|
|
{
|
|
if (sElement == NUI_WINDOW_GEOMETRY_BIND)
|
|
{
|
|
SetLocalJson(oPlayer, EXAMINE_WINDOW_GEOMETRY_JSON, NuiGetBind(oPlayer, nToken, NUI_WINDOW_GEOMETRY_BIND));
|
|
}
|
|
}
|
|
}
|
|
|
|
int Examine_HandleIdentifyItem(object oPlayer, object oItem)
|
|
{
|
|
int bIdentified = GetIdentified(oItem);
|
|
|
|
if (!bIdentified)
|
|
{
|
|
int nIdentifySkillRank = GetSkillRank(SKILL_LORE, oPlayer);
|
|
|
|
if (nIdentifySkillRank < 0)
|
|
return FALSE;
|
|
if (nIdentifySkillRank > 55)
|
|
{
|
|
SetIdentified(oItem, TRUE);
|
|
return TRUE;
|
|
}
|
|
|
|
int nMaxItemGPValue = StringToInt(Get2DAString("skillvsitemcost", "DeviceCostMax", nIdentifySkillRank));
|
|
|
|
SetIdentified(oItem, TRUE);
|
|
bIdentified = GetGoldPieceValue(oItem) <= nMaxItemGPValue;
|
|
SetIdentified(oItem, bIdentified);
|
|
}
|
|
|
|
return bIdentified;
|
|
}
|
|
|
|
void Examine_SetData(object oPlayer, int nToken, object oTarget, int nPanel)
|
|
{
|
|
Examine_SetGenericData(oPlayer, nToken, oTarget, nPanel);
|
|
|
|
if (nPanel == GUI_PANEL_EXAMINE_ITEM)
|
|
Examine_SetItemData(oPlayer, nToken, oTarget);
|
|
}
|
|
|
|
void Examine_SetGenericData(object oPlayer, int nToken, object oTarget, int nPanel)
|
|
{
|
|
string sTitle, sDescription;
|
|
json jImage1, jImage2, jImage3;
|
|
int bComplexItem = FALSE;
|
|
switch (nPanel)
|
|
{
|
|
case GUI_PANEL_EXAMINE_CREATURE:
|
|
case GUI_PANEL_EXAMINE_PLACEABLE:
|
|
case GUI_PANEL_EXAMINE_DOOR:
|
|
{
|
|
sTitle = GetName(oTarget);
|
|
jImage1 = JsonString(GetPortraitResRef(oTarget) + "m");
|
|
sDescription = GetDescription(oTarget);
|
|
break;
|
|
}
|
|
|
|
case GUI_PANEL_EXAMINE_ITEM:
|
|
{
|
|
int bIdentified = Examine_HandleIdentifyItem(oPlayer, oTarget);
|
|
int nBaseItemType = GetBaseItemType(oTarget);
|
|
sTitle = Util_GetItemName(oTarget, bIdentified);
|
|
|
|
json jItem = ObjectToJson(oTarget);
|
|
json jComplexIconData = Util_GetComplexIconData(jItem, nBaseItemType);
|
|
|
|
if (JsonGetType(jComplexIconData))
|
|
{
|
|
jImage1 = JsonObjectGet(jComplexIconData, "bottom");
|
|
jImage2 = JsonObjectGet(jComplexIconData, "middle");
|
|
jImage3 = JsonObjectGet(jComplexIconData, "top");
|
|
bComplexItem = TRUE;
|
|
}
|
|
else
|
|
{
|
|
jImage1 = JsonString(Util_GetIconResref(oTarget, jItem, nBaseItemType));
|
|
}
|
|
|
|
sDescription = GetDescription(oTarget, FALSE, bIdentified);
|
|
|
|
int nStatsStrRef = StringToInt(Get2DAString("baseitems", "BaseItemStatRef", nBaseItemType));
|
|
if (nStatsStrRef)
|
|
{
|
|
sDescription += "\n\n" + GetStringByStrRef(nStatsStrRef);
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
NuiSetBind(oPlayer, nToken, NUI_WINDOW_TITLE_BIND, JsonString(sTitle));
|
|
NuiSetBind(oPlayer, nToken, "image_1", jImage1);
|
|
|
|
if (bComplexItem)
|
|
{
|
|
NuiSetBind(oPlayer, nToken, "image_2", jImage2);
|
|
NuiSetBind(oPlayer, nToken, "image_3", jImage3);
|
|
}
|
|
|
|
NuiSetBind(oPlayer, nToken, "complex_item", JsonBool(bComplexItem));
|
|
NuiSetBind(oPlayer, nToken, "description", JsonString(sDescription));
|
|
}
|
|
|
|
string Examine_GetItemPropertyString(itemproperty ip)
|
|
{
|
|
int nType = GetItemPropertyType(ip);
|
|
string sName = GetStringByStrRef(StringToInt(Get2DAString("itempropdef", "GameStrRef", nType)));
|
|
|
|
int nSubType = GetItemPropertySubType(ip);
|
|
if(nSubType != -1)
|
|
{
|
|
string sSubTypeResRef = Get2DAString("itempropdef", "SubTypeResRef", nType);
|
|
int nStrRef = StringToInt(Get2DAString(sSubTypeResRef, "Name", nSubType));
|
|
if(nStrRef)
|
|
sName += " " + GetStringByStrRef(nStrRef);
|
|
}
|
|
|
|
int nParam1 = GetItemPropertyParam1(ip);
|
|
if(nParam1 != -1)
|
|
{
|
|
string sParamResRef = Get2DAString("iprp_paramtable", "TableResRef", nParam1);
|
|
string sSubTypeResRef = Get2DAString("itempropdef", "SubTypeResRef", nType);
|
|
string sTableResRef = Get2DAString(sSubTypeResRef, "TableResRef", nParam1);
|
|
int nStrRef = StringToInt(Get2DAString(sParamResRef, "Name", GetItemPropertyParam1Value(ip)));
|
|
if(nStrRef)
|
|
sName += " " + GetStringByStrRef(nStrRef);
|
|
}
|
|
|
|
int nCostTable = GetItemPropertyCostTable(ip);
|
|
if(nCostTable != -1)
|
|
{
|
|
string sCostTableResRef = Get2DAString("iprp_costtable", "Name", nCostTable);
|
|
int nStrRef = StringToInt(Get2DAString(sCostTableResRef, "Name", GetItemPropertyCostTableValue(ip)));
|
|
if(nStrRef)
|
|
sName += " " + GetStringByStrRef(nStrRef);
|
|
}
|
|
|
|
return sName;
|
|
}
|
|
|
|
void Examine_SetItemData(object oPlayer, int nToken, object oItem)
|
|
{
|
|
int bIdentified = GetIdentified(oItem);
|
|
json jProperties = JsonArray();
|
|
json jColors = JsonArray();
|
|
|
|
if (bIdentified)
|
|
{
|
|
itemproperty ip = GetFirstItemProperty(oItem);
|
|
while (GetIsItemPropertyValid(ip))
|
|
{
|
|
jProperties = JsonArrayInsert(jProperties, JsonString(Examine_GetItemPropertyString(ip)));
|
|
jColors = JsonArrayInsert(jColors, GetItemPropertyDurationType(ip) == DURATION_TYPE_TEMPORARY ? NuiColor(0, 0, 255) : NuiColor(255, 255, 255));
|
|
ip = GetNextItemProperty(oItem);
|
|
}
|
|
}
|
|
|
|
NuiSetBind(oPlayer, nToken, "property", jProperties);
|
|
NuiSetBind(oPlayer, nToken, "color", jColors);
|
|
}
|
|
|