diff --git a/_module/are/area.are.json b/_module/are/area.are.json index 4853034b..fc1748c6 100644 --- a/_module/are/area.are.json +++ b/_module/are/area.are.json @@ -2913,7 +2913,7 @@ }, "Version": { "type": "dword", - "value": 62 + "value": 63 }, "Width": { "type": "int", diff --git a/_module/are/panoptican.are.json b/_module/are/panoptican.are.json index a3034d1d..d36d3377 100644 --- a/_module/are/panoptican.are.json +++ b/_module/are/panoptican.are.json @@ -2569,7 +2569,7 @@ }, "Version": { "type": "dword", - "value": 72 + "value": 73 }, "Width": { "type": "int", diff --git a/_module/are/sarumadventurers.are.json b/_module/are/sarumadventurers.are.json index 0f448673..a638616b 100644 --- a/_module/are/sarumadventurers.are.json +++ b/_module/are/sarumadventurers.are.json @@ -677,7 +677,7 @@ }, "Version": { "type": "dword", - "value": 2 + "value": 3 }, "Width": { "type": "int", diff --git a/_module/are/sarumcity.are.json b/_module/are/sarumcity.are.json index 823629ba..1ff6abe6 100644 --- a/_module/are/sarumcity.are.json +++ b/_module/are/sarumcity.are.json @@ -41484,7 +41484,7 @@ }, "Version": { "type": "dword", - "value": 24 + "value": 26 }, "Width": { "type": "int", diff --git a/_module/dlg/hs_del_pc.dlg.json b/_module/dlg/hs_del_pc.dlg.json new file mode 100644 index 00000000..907f70be --- /dev/null +++ b/_module/dlg/hs_del_pc.dlg.json @@ -0,0 +1,1324 @@ +{ + "__data_type": "DLG ", + "DelayEntry": { + "type": "dword", + "value": 0 + }, + "DelayReply": { + "type": "dword", + "value": 0 + }, + "EndConverAbort": { + "type": "resref", + "value": "nw_walk_wp" + }, + "EndConversation": { + "type": "resref", + "value": "nw_walk_wp" + }, + "EntryList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 6 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 1 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "What do you need?" + } + } + }, + { + "__struct_id": 1, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 3 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 2 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "You'd like to delete this character from the server vault?" + } + } + }, + { + "__struct_id": 2, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 5 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 4 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": " Are you certain? You will be booted from the server. When you come back your character will be deleted. This cannot be undone, and there is nothing the server admins or DMs can do to undelete this character." + } + } + }, + { + "__struct_id": 3, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 10 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 1, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 9 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 2, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 8 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 7 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "The cost is 5000 gold per level.\nHow many levels?" + } + } + }, + { + "__struct_id": 4, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 6 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "leveltake10" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Very well." + } + } + }, + { + "__struct_id": 5, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 6 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "leveltake5" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Very well." + } + } + }, + { + "__struct_id": 6, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "RepliesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 6 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Script": { + "type": "resref", + "value": "leveltake1" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Speaker": { + "type": "cexostring", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Very well." + } + } + } + ] + }, + "NumWords": { + "type": "dword", + "value": 104 + }, + "PreventZoomIn": { + "type": "byte", + "value": 0 + }, + "ReplyList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Done" + } + } + }, + { + "__struct_id": 1, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 1 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I'd like to delete this character." + } + } + }, + { + "__struct_id": 2, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "No." + } + } + }, + { + "__struct_id": 3, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 2 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Yes." + } + } + }, + { + "__struct_id": 4, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "No, my mistake." + } + } + }, + { + "__struct_id": 5, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "dante_letodel_at" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Yes, proceed." + } + } + }, + { + "__struct_id": 6, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 3 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "I'd like to relevel this character." + } + } + }, + { + "__struct_id": 7, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + }, + "IsChild": { + "type": "byte", + "value": 1 + }, + "LinkComment": { + "type": "cexostring", + "value": "" + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "Nevermind." + } + } + }, + { + "__struct_id": 8, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 4 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "10 levels for 50,000 gold." + } + } + }, + { + "__struct_id": 9, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 5 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "5 levels for 25,000 gold." + } + } + }, + { + "__struct_id": 10, + "ActionParams": { + "type": "list", + "value": [] + }, + "Animation": { + "type": "dword", + "value": 0 + }, + "AnimLoop": { + "type": "byte", + "value": 1 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Delay": { + "type": "dword", + "value": 4294967295 + }, + "EntriesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 6 + }, + "IsChild": { + "type": "byte", + "value": 0 + } + } + ] + }, + "Quest": { + "type": "cexostring", + "value": "" + }, + "Script": { + "type": "resref", + "value": "" + }, + "Sound": { + "type": "resref", + "value": "" + }, + "Text": { + "type": "cexolocstring", + "value": { + "0": "1 level for 5,000 gold." + } + } + } + ] + }, + "StartingList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Active": { + "type": "resref", + "value": "" + }, + "ConditionParams": { + "type": "list", + "value": [] + }, + "Index": { + "type": "dword", + "value": 0 + } + } + ] + } +} diff --git a/_module/gic/sarumadventurers.gic.json b/_module/gic/sarumadventurers.gic.json index fc0272e2..6f54da8c 100644 --- a/_module/gic/sarumadventurers.gic.json +++ b/_module/gic/sarumadventurers.gic.json @@ -2,7 +2,15 @@ "__data_type": "GIC ", "Creature List": { "type": "list", - "value": [] + "value": [ + { + "__struct_id": 4, + "Comment": { + "type": "cexostring", + "value": "Annihilus" + } + } + ] }, "Door List": { "type": "list", @@ -56,6 +64,14 @@ }, "WaypointList": { "type": "list", - "value": [] + "value": [ + { + "__struct_id": 5, + "Comment": { + "type": "cexostring", + "value": "" + } + } + ] } } diff --git a/_module/gic/sarumcity.gic.json b/_module/gic/sarumcity.gic.json index bcc2ce90..3d4a3d5f 100644 --- a/_module/gic/sarumcity.gic.json +++ b/_module/gic/sarumcity.gic.json @@ -6322,6 +6322,27 @@ "value": "" } }, + { + "__struct_id": 5, + "Comment": { + "type": "cexostring", + "value": "" + } + }, + { + "__struct_id": 5, + "Comment": { + "type": "cexostring", + "value": "This is the default waypoint you may place to set a patrol path for a creature or NPC.\r\n1. Create the creature and either use its current Tag or fill in a new one.\r\n2. Place or make sure the WalkWayPoints() is within the body of the On Spawn script for the creature.\r\n3. Place a series of waypoints along the route you wish the creature to walk.\r\n4. Select all of the newly created waypoints and right click. Choose the Create Set option.\r\n5. The waypoint set will have a set name of \"WP_\" + NPC Tag. Thus if an NPC with the Tag \"Guard\" will have a waypoint set called \"WP_Guard\". Note that Tags are case sensitive." + } + }, + { + "__struct_id": 5, + "Comment": { + "type": "cexostring", + "value": "" + } + }, { "__struct_id": 5, "Comment": { diff --git a/_module/git/panoptican.git.json b/_module/git/panoptican.git.json index 1cceda16..9a83bed4 100644 --- a/_module/git/panoptican.git.json +++ b/_module/git/panoptican.git.json @@ -31518,7 +31518,7 @@ }, "LinkedToFlags": { "type": "byte", - "value": 1 + "value": 2 }, "LoadScreenID": { "type": "word", diff --git a/_module/git/sarumadventurers.git.json b/_module/git/sarumadventurers.git.json index 335db73e..1827298d 100644 --- a/_module/git/sarumadventurers.git.json +++ b/_module/git/sarumadventurers.git.json @@ -45,7 +45,1838 @@ }, "Creature List": { "type": "list", - "value": [] + "value": [ + { + "__struct_id": 4, + "Appearance_Head": { + "type": "byte", + "value": 14 + }, + "Appearance_Type": { + "type": "word", + "value": 1 + }, + "ArmorPart_RFoot": { + "type": "byte", + "value": 1 + }, + "BodyBag": { + "type": "byte", + "value": 0 + }, + "BodyPart_Belt": { + "type": "byte", + "value": 0 + }, + "BodyPart_LBicep": { + "type": "byte", + "value": 1 + }, + "BodyPart_LFArm": { + "type": "byte", + "value": 1 + }, + "BodyPart_LFoot": { + "type": "byte", + "value": 1 + }, + "BodyPart_LHand": { + "type": "byte", + "value": 1 + }, + "BodyPart_LShin": { + "type": "byte", + "value": 1 + }, + "BodyPart_LShoul": { + "type": "byte", + "value": 0 + }, + "BodyPart_LThigh": { + "type": "byte", + "value": 1 + }, + "BodyPart_Neck": { + "type": "byte", + "value": 1 + }, + "BodyPart_Pelvis": { + "type": "byte", + "value": 1 + }, + "BodyPart_RBicep": { + "type": "byte", + "value": 1 + }, + "BodyPart_RFArm": { + "type": "byte", + "value": 1 + }, + "BodyPart_RHand": { + "type": "byte", + "value": 1 + }, + "BodyPart_RShin": { + "type": "byte", + "value": 1 + }, + "BodyPart_RShoul": { + "type": "byte", + "value": 0 + }, + "BodyPart_RThigh": { + "type": "byte", + "value": 1 + }, + "BodyPart_Torso": { + "type": "byte", + "value": 1 + }, + "Cha": { + "type": "byte", + "value": 18 + }, + "ChallengeRating": { + "type": "float", + "value": 50.0 + }, + "ClassList": { + "type": "list", + "value": [ + { + "__struct_id": 2, + "Class": { + "type": "int", + "value": 5 + }, + "ClassLevel": { + "type": "short", + "value": 1 + } + }, + { + "__struct_id": 2, + "Class": { + "type": "int", + "value": 1 + }, + "ClassLevel": { + "type": "short", + "value": 1 + }, + "KnownList0": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 33 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 37 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 100 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 151 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + }, + "KnownList1": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 442 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 436 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 66 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 102 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + }, + "KnownList2": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 9 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 13 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 21 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 36 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 163 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + }, + "KnownList3": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 20 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 545 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 78 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 539 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 441 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + }, + "KnownList4": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 31 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 82 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 88 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 373 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + }, + "KnownList5": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 121 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 67 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 80 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 118 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 179 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + }, + "KnownList6": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 445 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 369 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 113 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 180 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + } + }, + { + "__struct_id": 2, + "Class": { + "type": "int", + "value": 31 + }, + "ClassLevel": { + "type": "short", + "value": 1 + } + } + ] + }, + "Color_Hair": { + "type": "byte", + "value": 17 + }, + "Color_Skin": { + "type": "byte", + "value": 2 + }, + "Color_Tattoo1": { + "type": "byte", + "value": 67 + }, + "Color_Tattoo2": { + "type": "byte", + "value": 104 + }, + "Con": { + "type": "byte", + "value": 12 + }, + "Conversation": { + "type": "resref", + "value": "hs_del_pc" + }, + "CRAdjust": { + "type": "int", + "value": 0 + }, + "CurrentHitPoints": { + "type": "short", + "value": 308 + }, + "DecayTime": { + "type": "dword", + "value": 10000 + }, + "Deity": { + "type": "cexostring", + "value": "" + }, + "Description": { + "type": "cexolocstring", + "value": { + "0": "Talk to this person if you need to delete or relevel your character." + } + }, + "Dex": { + "type": "byte", + "value": 22 + }, + "Disarmable": { + "type": "byte", + "value": 0 + }, + "Equip_ItemList": { + "type": "list", + "value": [ + { + "__struct_id": 2, + "AddCost": { + "type": "dword", + "value": 0 + }, + "ArmorPart_Belt": { + "type": "byte", + "value": 0 + }, + "ArmorPart_LBicep": { + "type": "byte", + "value": 4 + }, + "ArmorPart_LFArm": { + "type": "byte", + "value": 4 + }, + "ArmorPart_LFoot": { + "type": "byte", + "value": 4 + }, + "ArmorPart_LHand": { + "type": "byte", + "value": 113 + }, + "ArmorPart_LShin": { + "type": "byte", + "value": 4 + }, + "ArmorPart_LShoul": { + "type": "byte", + "value": 0 + }, + "ArmorPart_LThigh": { + "type": "byte", + "value": 3 + }, + "ArmorPart_Neck": { + "type": "byte", + "value": 4 + }, + "ArmorPart_Pelvis": { + "type": "byte", + "value": 1 + }, + "ArmorPart_RBicep": { + "type": "byte", + "value": 4 + }, + "ArmorPart_RFArm": { + "type": "byte", + "value": 4 + }, + "ArmorPart_RFoot": { + "type": "byte", + "value": 4 + }, + "ArmorPart_RHand": { + "type": "byte", + "value": 113 + }, + "ArmorPart_Robe": { + "type": "byte", + "value": 251 + }, + "ArmorPart_RShin": { + "type": "byte", + "value": 4 + }, + "ArmorPart_RShoul": { + "type": "byte", + "value": 0 + }, + "ArmorPart_RThigh": { + "type": "byte", + "value": 3 + }, + "ArmorPart_Torso": { + "type": "byte", + "value": 1 + }, + "BaseItem": { + "type": "int", + "value": 16 + }, + "Charges": { + "type": "byte", + "value": 0 + }, + "Cloth1Color": { + "type": "byte", + "value": 0 + }, + "Cloth2Color": { + "type": "byte", + "value": 128 + }, + "Cost": { + "type": "dword", + "value": 6573157 + }, + "Cursed": { + "type": "byte", + "value": 1 + }, + "DescIdentified": { + "type": "cexolocstring", + "value": {} + }, + "Description": { + "type": "cexolocstring", + "value": {} + }, + "Identified": { + "type": "byte", + "value": 1 + }, + "Leather1Color": { + "type": "byte", + "value": 128 + }, + "Leather2Color": { + "type": "byte", + "value": 128 + }, + "LocalizedName": { + "type": "cexolocstring", + "value": { + "0": "Desert Nomad Armor1" + } + }, + "Metal1Color": { + "type": "byte", + "value": 12 + }, + "Metal2Color": { + "type": "byte", + "value": 50 + }, + "Plot": { + "type": "byte", + "value": 0 + }, + "PropertiesList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "ChanceAppear": { + "type": "byte", + "value": 100 + }, + "CostTable": { + "type": "byte", + "value": 2 + }, + "CostValue": { + "type": "word", + "value": 6 + }, + "Param1": { + "type": "byte", + "value": 255 + }, + "Param1Value": { + "type": "byte", + "value": 0 + }, + "PropertyName": { + "type": "word", + "value": 1 + }, + "Subtype": { + "type": "word", + "value": 0 + } + }, + { + "__struct_id": 0, + "ChanceAppear": { + "type": "byte", + "value": 100 + }, + "CostTable": { + "type": "byte", + "value": 6 + }, + "CostValue": { + "type": "word", + "value": 4 + }, + "Param1": { + "type": "byte", + "value": 255 + }, + "Param1Value": { + "type": "byte", + "value": 0 + }, + "PropertyName": { + "type": "word", + "value": 22 + }, + "Subtype": { + "type": "word", + "value": 4 + } + }, + { + "__struct_id": 0, + "ChanceAppear": { + "type": "byte", + "value": 100 + }, + "CostTable": { + "type": "byte", + "value": 7 + }, + "CostValue": { + "type": "word", + "value": 2 + }, + "Param1": { + "type": "byte", + "value": 255 + }, + "Param1Value": { + "type": "byte", + "value": 0 + }, + "PropertyName": { + "type": "word", + "value": 23 + }, + "Subtype": { + "type": "word", + "value": 0 + } + }, + { + "__struct_id": 0, + "ChanceAppear": { + "type": "byte", + "value": 100 + }, + "CostTable": { + "type": "byte", + "value": 7 + }, + "CostValue": { + "type": "word", + "value": 2 + }, + "Param1": { + "type": "byte", + "value": 255 + }, + "Param1Value": { + "type": "byte", + "value": 0 + }, + "PropertyName": { + "type": "word", + "value": 23 + }, + "Subtype": { + "type": "word", + "value": 1 + } + }, + { + "__struct_id": 0, + "ChanceAppear": { + "type": "byte", + "value": 100 + }, + "CostTable": { + "type": "byte", + "value": 7 + }, + "CostValue": { + "type": "word", + "value": 2 + }, + "Param1": { + "type": "byte", + "value": 255 + }, + "Param1Value": { + "type": "byte", + "value": 0 + }, + "PropertyName": { + "type": "word", + "value": 23 + }, + "Subtype": { + "type": "word", + "value": 2 + } + }, + { + "__struct_id": 0, + "ChanceAppear": { + "type": "byte", + "value": 100 + }, + "CostTable": { + "type": "byte", + "value": 26 + }, + "CostValue": { + "type": "word", + "value": 14 + }, + "Param1": { + "type": "byte", + "value": 255 + }, + "Param1Value": { + "type": "byte", + "value": 0 + }, + "PropertyName": { + "type": "word", + "value": 82 + }, + "Subtype": { + "type": "word", + "value": 44 + } + }, + { + "__struct_id": 0, + "ChanceAppear": { + "type": "byte", + "value": 100 + }, + "CostTable": { + "type": "byte", + "value": 2 + }, + "CostValue": { + "type": "word", + "value": 5 + }, + "Param1": { + "type": "byte", + "value": 255 + }, + "Param1Value": { + "type": "byte", + "value": 0 + }, + "PropertyName": { + "type": "word", + "value": 51 + }, + "Subtype": { + "type": "word", + "value": 0 + } + } + ] + }, + "StackSize": { + "type": "word", + "value": 1 + }, + "Stolen": { + "type": "byte", + "value": 0 + }, + "Tag": { + "type": "cexostring", + "value": "DesertNomadArmor1" + }, + "TemplateResRef": { + "type": "resref", + "value": "desertnomadarmor" + }, + "xArmorPart_Belt": { + "type": "word", + "value": 0 + }, + "xArmorPart_LBice": { + "type": "word", + "value": 4 + }, + "xArmorPart_LFArm": { + "type": "word", + "value": 4 + }, + "xArmorPart_LFoot": { + "type": "word", + "value": 4 + }, + "xArmorPart_LHand": { + "type": "word", + "value": 113 + }, + "xArmorPart_LShin": { + "type": "word", + "value": 4 + }, + "xArmorPart_LShou": { + "type": "word", + "value": 0 + }, + "xArmorPart_LThig": { + "type": "word", + "value": 3 + }, + "xArmorPart_Neck": { + "type": "word", + "value": 4 + }, + "xArmorPart_Pelvi": { + "type": "word", + "value": 1 + }, + "xArmorPart_RBice": { + "type": "word", + "value": 4 + }, + "xArmorPart_RFArm": { + "type": "word", + "value": 4 + }, + "xArmorPart_RFoot": { + "type": "word", + "value": 4 + }, + "xArmorPart_RHand": { + "type": "word", + "value": 113 + }, + "xArmorPart_Robe": { + "type": "word", + "value": 251 + }, + "xArmorPart_RShin": { + "type": "word", + "value": 4 + }, + "xArmorPart_RShou": { + "type": "word", + "value": 0 + }, + "xArmorPart_RThig": { + "type": "word", + "value": 3 + }, + "xArmorPart_Torso": { + "type": "word", + "value": 1 + }, + "XOrientation": { + "type": "float", + "value": 0.0 + }, + "XPosition": { + "type": "float", + "value": -1.0 + }, + "YOrientation": { + "type": "float", + "value": 1.0 + }, + "YPosition": { + "type": "float", + "value": -1.0 + }, + "ZPosition": { + "type": "float", + "value": -1.0 + } + } + ] + }, + "FactionID": { + "type": "word", + "value": 3 + }, + "FeatList": { + "type": "list", + "value": [ + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 2 + } + }, + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 3 + } + }, + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 4 + } + }, + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 32 + } + }, + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 45 + } + }, + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 49 + } + }, + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 46 + } + } + ] + }, + "FirstName": { + "type": "cexolocstring", + "value": { + "0": "Lotran" + } + }, + "fortbonus": { + "type": "short", + "value": 0 + }, + "Gender": { + "type": "byte", + "value": 4 + }, + "GoodEvil": { + "type": "byte", + "value": 50 + }, + "HitPoints": { + "type": "short", + "value": 308 + }, + "Int": { + "type": "byte", + "value": 12 + }, + "Interruptable": { + "type": "byte", + "value": 1 + }, + "IsImmortal": { + "type": "byte", + "value": 1 + }, + "IsPC": { + "type": "byte", + "value": 0 + }, + "LastName": { + "type": "cexolocstring", + "value": { + "0": "" + } + }, + "LawfulChaotic": { + "type": "byte", + "value": 50 + }, + "Lootable": { + "type": "byte", + "value": 0 + }, + "MaxHitPoints": { + "type": "short", + "value": 308 + }, + "NaturalAC": { + "type": "byte", + "value": 0 + }, + "NoPermDeath": { + "type": "byte", + "value": 1 + }, + "PerceptionRange": { + "type": "byte", + "value": 8 + }, + "Phenotype": { + "type": "int", + "value": 0 + }, + "Plot": { + "type": "byte", + "value": 1 + }, + "PortraitId": { + "type": "word", + "value": 2259 + }, + "Race": { + "type": "byte", + "value": 1 + }, + "refbonus": { + "type": "short", + "value": 0 + }, + "ScriptAttacked": { + "type": "resref", + "value": "x2_def_attacked" + }, + "ScriptDamaged": { + "type": "resref", + "value": "x2_def_ondamage" + }, + "ScriptDeath": { + "type": "resref", + "value": "x2_def_ondeath" + }, + "ScriptDialogue": { + "type": "resref", + "value": "x2_def_onconv" + }, + "ScriptDisturbed": { + "type": "resref", + "value": "x2_def_ondisturb" + }, + "ScriptEndRound": { + "type": "resref", + "value": "x2_def_endcombat" + }, + "ScriptHeartbeat": { + "type": "resref", + "value": "x2_def_heartbeat" + }, + "ScriptOnBlocked": { + "type": "resref", + "value": "x2_def_onblocked" + }, + "ScriptOnNotice": { + "type": "resref", + "value": "" + }, + "ScriptRested": { + "type": "resref", + "value": "x2_def_rested" + }, + "ScriptSpawn": { + "type": "resref", + "value": "x2_def_spawn" + }, + "ScriptSpellAt": { + "type": "resref", + "value": "x2_def_spellcast" + }, + "ScriptUserDefine": { + "type": "resref", + "value": "x2_def_userdef" + }, + "SkillList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 19 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 43 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 5 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 43 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 43 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 30 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 1 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 26 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 40 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + } + ] + }, + "SoundSetFile": { + "type": "word", + "value": 132 + }, + "SpecAbilityList": { + "type": "list", + "value": [] + }, + "StartingPackage": { + "type": "byte", + "value": 43 + }, + "Str": { + "type": "byte", + "value": 14 + }, + "Subrace": { + "type": "cexostring", + "value": "" + }, + "Tag": { + "type": "cexostring", + "value": "Lotran" + }, + "Tail_New": { + "type": "dword", + "value": 0 + }, + "TemplateList": { + "type": "list", + "value": [] + }, + "TemplateResRef": { + "type": "resref", + "value": "npc_annihilus" + }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "Annihilus" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "GLOW_COLOR" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 13 + } + } + ] + }, + "WalkRate": { + "type": "int", + "value": 5 + }, + "willbonus": { + "type": "short", + "value": 0 + }, + "Wings_New": { + "type": "dword", + "value": 0 + }, + "Wis": { + "type": "byte", + "value": 8 + }, + "xAppearance_Head": { + "type": "word", + "value": 14 + }, + "xArmorPart_RFoot": { + "type": "word", + "value": 1 + }, + "xBodyPart_Belt": { + "type": "word", + "value": 0 + }, + "xBodyPart_LBicep": { + "type": "word", + "value": 1 + }, + "xBodyPart_LFArm": { + "type": "word", + "value": 1 + }, + "xBodyPart_LFoot": { + "type": "word", + "value": 1 + }, + "xBodyPart_LHand": { + "type": "word", + "value": 1 + }, + "xBodyPart_LShin": { + "type": "word", + "value": 1 + }, + "xBodyPart_LShoul": { + "type": "word", + "value": 0 + }, + "xBodyPart_LThigh": { + "type": "word", + "value": 1 + }, + "xBodyPart_Neck": { + "type": "word", + "value": 1 + }, + "xBodyPart_Pelvis": { + "type": "word", + "value": 1 + }, + "xBodyPart_RBicep": { + "type": "word", + "value": 1 + }, + "xBodyPart_RFArm": { + "type": "word", + "value": 1 + }, + "xBodyPart_RHand": { + "type": "word", + "value": 1 + }, + "xBodyPart_RShin": { + "type": "word", + "value": 1 + }, + "xBodyPart_RShoul": { + "type": "word", + "value": 0 + }, + "xBodyPart_RThigh": { + "type": "word", + "value": 1 + }, + "xBodyPart_Torso": { + "type": "word", + "value": 1 + }, + "XOrientation": { + "type": "float", + "value": -1.0 + }, + "XPosition": { + "type": "float", + "value": 35.11000061035156 + }, + "YOrientation": { + "type": "float", + "value": 1.56122585546128e-039 + }, + "YPosition": { + "type": "float", + "value": 13.69999980926514 + }, + "ZPosition": { + "type": "float", + "value": 0.0 + } + } + ] }, "Door List": { "type": "list", @@ -741,6 +2572,66 @@ }, "WaypointList": { "type": "list", - "value": [] + "value": [ + { + "__struct_id": 5, + "Appearance": { + "type": "byte", + "value": 1 + }, + "Description": { + "type": "cexolocstring", + "value": {} + }, + "HasMapNote": { + "type": "byte", + "value": 0 + }, + "LinkedTo": { + "type": "cexostring", + "value": "" + }, + "LocalizedName": { + "type": "cexolocstring", + "value": {} + }, + "MapNote": { + "type": "cexolocstring", + "value": {} + }, + "MapNoteEnabled": { + "type": "byte", + "value": 0 + }, + "Tag": { + "type": "cexostring", + "value": "WP_Lotran_01" + }, + "TemplateResRef": { + "type": "resref", + "value": "" + }, + "XOrientation": { + "type": "float", + "value": -1.0 + }, + "XPosition": { + "type": "float", + "value": 35.15802764892578 + }, + "YOrientation": { + "type": "float", + "value": 3.363116314379561e-044 + }, + "YPosition": { + "type": "float", + "value": 13.71480369567871 + }, + "ZPosition": { + "type": "float", + "value": -5.7220458984375e-006 + } + } + ] } } diff --git a/_module/git/sarumcity.git.json b/_module/git/sarumcity.git.json index d11db129..23546bcf 100644 --- a/_module/git/sarumcity.git.json +++ b/_module/git/sarumcity.git.json @@ -17041,6 +17041,26 @@ "type": "resref", "value": "cityguardmaine" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "PickupItems" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 99 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -31210,6 +31230,26 @@ "type": "resref", "value": "horadush" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "PickupItems" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 99 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -34572,6 +34612,26 @@ "type": "resref", "value": "fjresidentialg" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "PickupItems" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 99 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -34737,7 +34797,7 @@ }, "DecayTime": { "type": "dword", - "value": 0 + "value": 5000 }, "Deity": { "type": "cexostring", @@ -35285,6 +35345,26 @@ "type": "resref", "value": "aniril" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "PickupItems" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 99 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -36574,6 +36654,26 @@ "type": "resref", "value": "devlin" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "PickupItems" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 99 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -41484,6 +41584,26 @@ "type": "resref", "value": "fjestateguard" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "PickupItems" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 99 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -42155,6 +42275,26 @@ "type": "resref", "value": "jandrin" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "PickupItems" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 99 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -46989,6 +47129,26 @@ "type": "resref", "value": "fjestateguard" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "PickupItems" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 99 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -50117,6 +50277,26 @@ "type": "resref", "value": "fjresidential001" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "PickupItems" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 99 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -53245,6 +53425,26 @@ "type": "resref", "value": "fjresidential001" }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "PickupItems" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 99 + } + } + ] + }, "WalkRate": { "type": "int", "value": 4 @@ -54469,7 +54669,7 @@ }, "Bearing": { "type": "float", - "value": -3.141592264175415 + "value": -0.0 }, "CloseLockDC": { "type": "byte", @@ -88387,7 +88587,7 @@ }, "Bearing": { "type": "float", - "value": -2.356194496154785 + "value": 0.7853981852531433 }, "CloseLockDC": { "type": "byte", @@ -88470,7 +88670,7 @@ }, "OnClick": { "type": "resref", - "value": "" + "value": "bb_closedoor" }, "OnClosed": { "type": "resref", @@ -88784,7 +88984,7 @@ }, "Y": { "type": "float", - "value": 85.44999694824219 + "value": 85.66999816894531 }, "Z": { "type": "float", @@ -201651,6 +201851,194 @@ "type": "float", "value": -5.7220458984375e-006 } + }, + { + "__struct_id": 5, + "Appearance": { + "type": "byte", + "value": 1 + }, + "Description": { + "type": "cexolocstring", + "value": {} + }, + "HasMapNote": { + "type": "byte", + "value": 0 + }, + "LinkedTo": { + "type": "cexostring", + "value": "" + }, + "LocalizedName": { + "id": 14817, + "type": "cexolocstring", + "value": { + "0": "EntranceToPanop" + } + }, + "MapNote": { + "type": "cexolocstring", + "value": {} + }, + "MapNoteEnabled": { + "type": "byte", + "value": 1 + }, + "Tag": { + "type": "cexostring", + "value": "EntranceToPanop" + }, + "TemplateResRef": { + "type": "resref", + "value": "nw_waypoint001" + }, + "XOrientation": { + "type": "float", + "value": -0.7071067690849304 + }, + "XPosition": { + "type": "float", + "value": 212.9541778564453 + }, + "YOrientation": { + "type": "float", + "value": 0.7071067690849304 + }, + "YPosition": { + "type": "float", + "value": 87.10371398925781 + }, + "ZPosition": { + "type": "float", + "value": -5.7220458984375e-006 + } + }, + { + "__struct_id": 5, + "Appearance": { + "type": "byte", + "value": 1 + }, + "Description": { + "type": "cexolocstring", + "value": { + "0": "this code is used for npcs to spawn only in the day time and randomly walk around 50 metres from spawn point.\nand have 90% chance of picking anything up they find.\n\nit again uses the random amount code (SX01R04) to reflect a \"crowd\". they will not respawn on death and only reappear on server reset (if you kill bob the smithy, he aint coming back right away, lol)\nnote: most if not all npcs,s should be \"plot\"....." + } + }, + "HasMapNote": { + "type": "byte", + "value": 0 + }, + "LinkedTo": { + "type": "cexostring", + "value": "" + }, + "LocalizedName": { + "type": "cexolocstring", + "value": { + "0": "SP_SX02R04_GT01_SR10_SH06T22_PU" + } + }, + "MapNote": { + "type": "cexolocstring", + "value": {} + }, + "MapNoteEnabled": { + "type": "byte", + "value": 0 + }, + "Tag": { + "type": "cexostring", + "value": "femalecommoner" + }, + "TemplateResRef": { + "type": "resref", + "value": "sp_002" + }, + "XOrientation": { + "type": "float", + "value": 1.541428310757299e-043 + }, + "XPosition": { + "type": "float", + "value": 38.43539428710938 + }, + "YOrientation": { + "type": "float", + "value": 1.0 + }, + "YPosition": { + "type": "float", + "value": 23.11942672729492 + }, + "ZPosition": { + "type": "float", + "value": -5.222045729169622e-006 + } + }, + { + "__struct_id": 5, + "Appearance": { + "type": "byte", + "value": 1 + }, + "Description": { + "type": "cexolocstring", + "value": { + "0": "this code is used for npcs to spawn only in the day time and randomly walk around 50 metres from spawn point.\nand have 90% chance of picking anything up they find.\n\nit again uses the random amount code (SX01R04) to reflect a \"crowd\". they will not respawn on death and only reappear on server reset (if you kill bob the smithy, he aint coming back right away, lol)\nnote: most if not all npcs,s should be \"plot\"....." + } + }, + "HasMapNote": { + "type": "byte", + "value": 0 + }, + "LinkedTo": { + "type": "cexostring", + "value": "" + }, + "LocalizedName": { + "type": "cexolocstring", + "value": { + "0": "SP_SX02R04_GT01_SR10_SH06T22_PU99" + } + }, + "MapNote": { + "type": "cexolocstring", + "value": {} + }, + "MapNoteEnabled": { + "type": "byte", + "value": 0 + }, + "Tag": { + "type": "cexostring", + "value": "femalepeasant" + }, + "TemplateResRef": { + "type": "resref", + "value": "sp_002" + }, + "XOrientation": { + "type": "float", + "value": 1.541428310757299e-043 + }, + "XPosition": { + "type": "float", + "value": 43.54985046386719 + }, + "YOrientation": { + "type": "float", + "value": 1.0 + }, + "YPosition": { + "type": "float", + "value": 26.39497375488281 + }, + "ZPosition": { + "type": "float", + "value": -5.222045729169622e-006 + } } ] } diff --git a/_module/itp/creaturepalcus.itp.json b/_module/itp/creaturepalcus.itp.json index 02973438..598d4105 100644 --- a/_module/itp/creaturepalcus.itp.json +++ b/_module/itp/creaturepalcus.itp.json @@ -3393,25 +3393,6 @@ "value": "chicken" } }, - { - "__struct_id": 0, - "CR": { - "type": "float", - "value": 0.3333333432674408 - }, - "FACTION": { - "type": "cexostring", - "value": "Commoner" - }, - "RESREF": { - "type": "resref", - "value": "prc_chicken" - }, - "STRREF": { - "type": "dword", - "value": 12416 - } - }, { "__struct_id": 0, "CR": { @@ -3469,6 +3450,25 @@ "value": "chicken3" } }, + { + "__struct_id": 0, + "CR": { + "type": "float", + "value": 0.3333333432674408 + }, + "FACTION": { + "type": "cexostring", + "value": "Commoner" + }, + "RESREF": { + "type": "resref", + "value": "prc_chicken" + }, + "STRREF": { + "type": "dword", + "value": 12416 + } + }, { "__struct_id": 0, "CR": { @@ -37876,6 +37876,25 @@ "value": "ow_sum_barb_8" } }, + { + "__struct_id": 0, + "CR": { + "type": "float", + "value": 50.0 + }, + "FACTION": { + "type": "cexostring", + "value": "Merchant" + }, + "NAME": { + "type": "cexostring", + "value": "Lotran" + }, + "RESREF": { + "type": "resref", + "value": "npc_annihilus" + } + }, { "__struct_id": 0, "CR": { diff --git a/_module/itp/itempalcus.itp.json b/_module/itp/itempalcus.itp.json index bbfe227a..91aa9468 100644 --- a/_module/itp/itempalcus.itp.json +++ b/_module/itp/itempalcus.itp.json @@ -135,6 +135,22 @@ "type": "byte", "value": 130 }, + "LIST": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "NAME": { + "type": "cexostring", + "value": "Gobling Ear - Left" + }, + "RESREF": { + "type": "resref", + "value": "item013" + } + } + ] + }, "STRREF": { "type": "dword", "value": 6699 diff --git a/_module/ncs/area_spawner.ncs b/_module/ncs/area_spawner.ncs index 9db78cec..da789ed0 100644 Binary files a/_module/ncs/area_spawner.ncs and b/_module/ncs/area_spawner.ncs differ diff --git a/_module/ncs/dante_letodel_at.ncs b/_module/ncs/dante_letodel_at.ncs new file mode 100644 index 00000000..a9b0c398 Binary files /dev/null and b/_module/ncs/dante_letodel_at.ncs differ diff --git a/_module/ncs/leveltake1.ncs b/_module/ncs/leveltake1.ncs new file mode 100644 index 00000000..b01918b5 Binary files /dev/null and b/_module/ncs/leveltake1.ncs differ diff --git a/_module/ncs/leveltake10.ncs b/_module/ncs/leveltake10.ncs new file mode 100644 index 00000000..88041a64 Binary files /dev/null and b/_module/ncs/leveltake10.ncs differ diff --git a/_module/ncs/leveltake5.ncs b/_module/ncs/leveltake5.ncs new file mode 100644 index 00000000..4c32454f Binary files /dev/null and b/_module/ncs/leveltake5.ncs differ diff --git a/_module/nss/area_spawner.nss b/_module/nss/area_spawner.nss index 3a5dbfd8..ae4ee43e 100644 --- a/_module/nss/area_spawner.nss +++ b/_module/nss/area_spawner.nss @@ -1590,6 +1590,10 @@ void sp_PerformActions(object oNearest, object oCurrent) { { object oPickup = GetNearestObject(OBJECT_TYPE_ITEM, oNearest); object oCurrent = GetNearestCreatureToLocation(CREATURE_TYPE_PLAYER_CHAR, FALSE, GetLocation(oPickup), 1, CREATURE_TYPE_IS_ALIVE, TRUE); + if (GetTag(oPickup) == "statueofgold") { + return; } + if (GetTag(oPickup) == "statueofjade") { + return; } if (GetDistanceBetweenLocations(GetLocation(oPickup), GetLocation(oCurrent)) < 40.0) { diff --git a/_module/nss/dante_letodel_at.nss b/_module/nss/dante_letodel_at.nss new file mode 100644 index 00000000..b614dcae --- /dev/null +++ b/_module/nss/dante_letodel_at.nss @@ -0,0 +1,20 @@ +#include "nwnx_admin" + +void main() +{ + object oPlayer = GetPCSpeaker(); + + string sName = GetName(oPlayer); + + string sPlayer = GetPCPlayerName(oPlayer); + + SendMessageToPC(oPlayer,"sPlayer = "+sPlayer); + SendMessageToPC(oPlayer,"sName = "+sName); + + NWNX_Administration_DeletePlayerCharacter(oPlayer, 1, "Character Deleted"); + SendMessageToPC(oPlayer,sPlayer+" has deleted "+sName); + SendMessageToAllDMs(sPlayer+" has deleted "+sName); +} + + + diff --git a/_module/nss/leveltake1.nss b/_module/nss/leveltake1.nss new file mode 100644 index 00000000..a6bb8164 --- /dev/null +++ b/_module/nss/leveltake1.nss @@ -0,0 +1,18 @@ +/// Determines how long to wait before restoring the target's XP value +const float XP_RESTORE_DELAY = 1.0f; + + +void main() +{ + object oTarget = GetPCSpeaker(); + int nLevels = 1; + int nOrigXP = GetXP(oTarget); + int nOrigHD = GetHitDice(oTarget); + int nTargetHD = nOrigHD - nLevels; + SetXP(oTarget, ((nTargetHD * (nTargetHD - 1)) / 2) * 1000); + // Schedule the OnLevelDown virtual event to be run right away + SetLocalInt(oTarget, "PRC_OnLevelDown_OldLevel", nOrigHD); + DelayCommand(0.0f, ExecuteScript("prc_onleveldown", oTarget)); + SetXP(oTarget, nOrigXP); + TakeGoldFromCreature (5000, oTarget); +} diff --git a/_module/nss/leveltake10.nss b/_module/nss/leveltake10.nss new file mode 100644 index 00000000..71127d9e --- /dev/null +++ b/_module/nss/leveltake10.nss @@ -0,0 +1,14 @@ +void main() +{ + object oTarget = GetPCSpeaker(); + int nLevels = 10; + int nOrigXP = GetXP(oTarget); + int nOrigHD = GetHitDice(oTarget); + int nTargetHD = nOrigHD - nLevels; + SetXP(oTarget, ((nTargetHD * (nTargetHD - 1)) / 2) * 1000); + // Schedule the OnLevelDown virtual event to be run right away + SetLocalInt(oTarget, "PRC_OnLevelDown_OldLevel", nOrigHD); + DelayCommand(0.0f, ExecuteScript("prc_onleveldown", oTarget)); + SetXP(oTarget, nOrigXP); + TakeGoldFromCreature (50000, oTarget); +} diff --git a/_module/nss/leveltake5.nss b/_module/nss/leveltake5.nss new file mode 100644 index 00000000..a7c08fc4 --- /dev/null +++ b/_module/nss/leveltake5.nss @@ -0,0 +1,14 @@ +void main() +{ + object oTarget = GetPCSpeaker(); + int nLevels = 5; + int nOrigXP = GetXP(oTarget); + int nOrigHD = GetHitDice(oTarget); + int nTargetHD = nOrigHD - nLevels; + SetXP(oTarget, ((nTargetHD * (nTargetHD - 1)) / 2) * 1000); + // Schedule the OnLevelDown virtual event to be run right away + SetLocalInt(oTarget, "PRC_OnLevelDown_OldLevel", nOrigHD); + DelayCommand(0.0f, ExecuteScript("prc_onleveldown", oTarget)); + SetXP(oTarget, nOrigXP); + TakeGoldFromCreature (25000, oTarget); +} diff --git a/_module/nss/nwnx.nss b/_module/nss/nwnx.nss new file mode 100644 index 00000000..fe8942cf --- /dev/null +++ b/_module/nss/nwnx.nss @@ -0,0 +1,113 @@ +/// @addtogroup nwnx NWNX +/// @brief Functions for plugin developers. +/// @{ +/// @file nwnx.nss + +/// @brief Scripting interface to NWNX. +/// @param pluginName The plugin name. +/// @param functionName The function name (do not include NWNX_Plugin_). +void NWNX_CallFunction(string pluginName, string functionName); +/// @brief Pushes the specified type to the c++ side +/// @param pluginName The plugin name. +/// @param functionName The function name (do not include NWNX_Plugin_). +/// @param value The value of specified type to push. +void NWNX_PushArgumentInt(string pluginName, string functionName, int value); +/// @copydoc NWNX_PushArgumentInt() +void NWNX_PushArgumentFloat(string pluginName, string functionName, float value); +/// @copydoc NWNX_PushArgumentInt() +void NWNX_PushArgumentObject(string pluginName, string functionName, object value); +/// @copydoc NWNX_PushArgumentInt() +void NWNX_PushArgumentString(string pluginName, string functionName, string value); +/// @copydoc NWNX_PushArgumentInt() +void NWNX_PushArgumentEffect(string pluginName, string functionName, effect value); +/// @copydoc NWNX_PushArgumentInt() +void NWNX_PushArgumentItemProperty(string pluginName, string functionName, itemproperty value); +/// @brief Returns the specified type from the c++ side +/// @param pluginName The plugin name. +/// @param functionName The function name (do not include NWNX_Plugin_). +/// @return The value of specified type. +int NWNX_GetReturnValueInt(string pluginName, string functionName); +/// @copydoc NWNX_GetReturnValueInt() +float NWNX_GetReturnValueFloat(string pluginName, string functionName); +/// @copydoc NWNX_GetReturnValueInt() +object NWNX_GetReturnValueObject(string pluginName, string functionName); +/// @copydoc NWNX_GetReturnValueInt() +string NWNX_GetReturnValueString(string pluginName, string functionName); +/// @copydoc NWNX_GetReturnValueInt() +effect NWNX_GetReturnValueEffect(string pluginName, string functionName); +/// @copydoc NWNX_GetReturnValueInt() +itemproperty NWNX_GetReturnValueItemProperty(string pluginName, string functionName); + +/// @private +string NWNX_INTERNAL_BuildString(string pluginName, string functionName, string operation) +{ + return "NWNXEE!ABIv2!" + pluginName + "!" + functionName + "!" + operation; +} +/// @} + +void NWNX_CallFunction(string pluginName, string functionName) +{ + PlaySound(NWNX_INTERNAL_BuildString(pluginName, functionName, "CALL")); +} + +void NWNX_PushArgumentInt(string pluginName, string functionName, int value) +{ + SetLocalInt(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "PUSH"), value); +} + +void NWNX_PushArgumentFloat(string pluginName, string functionName, float value) +{ + SetLocalFloat(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "PUSH"), value); +} + +void NWNX_PushArgumentObject(string pluginName, string functionName, object value) +{ + SetLocalObject(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "PUSH"), value); +} + +void NWNX_PushArgumentString(string pluginName, string functionName, string value) +{ + SetLocalString(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "PUSH"), value); +} + +void NWNX_PushArgumentEffect(string pluginName, string functionName, effect value) +{ + TagEffect(value, NWNX_INTERNAL_BuildString(pluginName, functionName, "PUSH")); +} + +void NWNX_PushArgumentItemProperty(string pluginName, string functionName, itemproperty value) +{ + TagItemProperty(value, NWNX_INTERNAL_BuildString(pluginName, functionName, "PUSH")); +} + +int NWNX_GetReturnValueInt(string pluginName, string functionName) +{ + return GetLocalInt(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "POP")); +} + +float NWNX_GetReturnValueFloat(string pluginName, string functionName) +{ + return GetLocalFloat(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "POP")); +} + +object NWNX_GetReturnValueObject(string pluginName, string functionName) +{ + return GetLocalObject(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "POP")); +} + +string NWNX_GetReturnValueString(string pluginName, string functionName) +{ + return GetLocalString(OBJECT_INVALID, NWNX_INTERNAL_BuildString(pluginName, functionName, "POP")); +} + +effect NWNX_GetReturnValueEffect(string pluginName, string functionName) +{ + effect e; + return TagEffect(e, NWNX_INTERNAL_BuildString(pluginName, functionName, "POP")); +} + +itemproperty NWNX_GetReturnValueItemProperty(string pluginName, string functionName) +{ + itemproperty ip; + return TagItemProperty(ip, NWNX_INTERNAL_BuildString(pluginName, functionName, "POP")); +} diff --git a/_module/nss/nwnx_admin.nss b/_module/nss/nwnx_admin.nss new file mode 100644 index 00000000..bbb43df9 --- /dev/null +++ b/_module/nss/nwnx_admin.nss @@ -0,0 +1,344 @@ +/// @addtogroup admin Administration +/// @brief Various admin related functions +/// @{ +/// @file nwnx_admin.nss +#include "nwnx" + +const string NWNX_Administration = "NWNX_Administration"; ///< @private + +/// @name Administration Options +/// @anchor admin_opts +/// +/// @{ +const int NWNX_ADMINISTRATION_OPTION_ALL_KILLABLE = 0; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_NON_PARTY_KILLABLE = 1; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_REQUIRE_RESURRECTION = 2; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_LOSE_STOLEN_ITEMS = 3; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_LOSE_ITEMS = 4; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_LOSE_EXP = 5; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_LOSE_GOLD = 6; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_LOSE_GOLD_NUM = 7; +const int NWNX_ADMINISTRATION_OPTION_LOSE_EXP_NUM = 8; +const int NWNX_ADMINISTRATION_OPTION_LOSE_ITEMS_NUM = 9; +const int NWNX_ADMINISTRATION_OPTION_PVP_SETTING = 10; // 0 = No PVP, 1 = Party PVP, 2 = Full PVP +const int NWNX_ADMINISTRATION_OPTION_PAUSE_AND_PLAY = 11; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_ONE_PARTY_ONLY = 12; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_ENFORCE_LEGAL_CHARACTERS = 13; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_ITEM_LEVEL_RESTRICTIONS = 14; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_CDKEY_BANLIST_ALLOWLIST = 15; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_DISALLOW_SHOUTING = 16; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_SHOW_DM_JOIN_MESSAGE = 17; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_BACKUP_SAVED_CHARACTERS = 18; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_AUTO_FAIL_SAVE_ON_1 = 19; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_VALIDATE_SPELLS = 20; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_EXAMINE_EFFECTS = 21; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_EXAMINE_CHALLENGE_RATING = 22; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_USE_MAX_HITPOINTS = 23; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_RESTORE_SPELLS_USES = 24; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_RESET_ENCOUNTER_SPAWN_POOL = 25; // TRUE/FALSE +const int NWNX_ADMINISTRATION_OPTION_HIDE_HITPOINTS_GAINED = 26; // TRUE/FALSE +/// @} + +/// @name Administration Debug Types +/// @anchor admin_debug +/// +/// @{ +const int NWNX_ADMINISTRATION_DEBUG_COMBAT = 0; // TRUE/FALSE +const int NWNX_ADMINISTRATION_DEBUG_SAVING_THROW = 1; // TRUE/FALSE +const int NWNX_ADMINISTRATION_DEBUG_MOVEMENT_SPEED = 2; // TRUE/FALSE +const int NWNX_ADMINISTRATION_DEBUG_HIT_DIE = 3; // TRUE/FALSE +/// @} + +/// @brief Gets the current player password. +/// @return The current player password. +string NWNX_Administration_GetPlayerPassword(); + +/// @brief Sets the password for players to login. +/// @param password The password to use. +void NWNX_Administration_SetPlayerPassword(string password); + +/// @brief Clears the player password required to login. +void NWNX_Administration_ClearPlayerPassword(); + +/// @brief Gets the current DM password. +/// @return The current DM password. +string NWNX_Administration_GetDMPassword(); + +/// @brief Sets the password for DMs to login. +/// @param password The password to use. +void NWNX_Administration_SetDMPassword(string password); + +/// @brief Signals the server to immediately shut down. +void NWNX_Administration_ShutdownServer(); + +/// @brief Deletes the player character from the servervault +/// +/// The PC will be immediately booted from the game with a "Delete Character" message +/// +/// @param oPC The player to delete. +/// @param bPreserveBackup If true, it will leave the file on server, only appending ".deleted0" to the bic filename. +/// @param sKickMessage An optional kick message, if left blank it will default to "Delete Character" as reason. +void NWNX_Administration_DeletePlayerCharacter(object oPC, int bPreserveBackup = TRUE, string sKickMessage = ""); + +/// @brief Bans the provided IP. +/// @param ip The IP Address to ban. +void NWNX_Administration_AddBannedIP(string ip); + +/// @brief Removes the ban on the provided IP. +/// @param ip The IP Address to unban. +void NWNX_Administration_RemoveBannedIP(string ip); + +/// @brief Bans the provided Public CD Key. +/// @param key The Public CD Key to ban. +void NWNX_Administration_AddBannedCDKey(string key); + +/// @brief Removes the ban on the provided Public CD Key. +/// @param key The Public CD Key to unban. +void NWNX_Administration_RemoveBannedCDKey(string key); + +/// @brief Bans the provided playername. +/// @param playerName The player name (community name) to ban. +/// @warning A user can change their playername at will. +void NWNX_Administration_AddBannedPlayerName(string playerName); + +/// @brief Removes the ban on the provided playername. +/// @param playerName The player name (community name) to unban. +void NWNX_Administration_RemoveBannedPlayerName(string playerName); + +/// @brief Get a list of all banned IPs/Keys/names as a string. +/// @return A string with a listing of the banned IPs/Keys/names. +string NWNX_Administration_GetBannedList(); + +/// @brief Set the module's name as shown to the serverlist. +/// @param name The name to give the module. +void NWNX_Administration_SetModuleName(string name); + +/// @brief Set the server's name as shown to the serverlist. +/// @param name The name to give the server. +void NWNX_Administration_SetServerName(string name); + +/// @brief Returns the server's name as shown to the serverlist. +string NWNX_Administration_GetServerName(); + +/// @brief Get an @ref admin_opts "Administration Option" value. +/// @param option An @ref admin_opts "Administration Option". +/// @return The current setting for the supplied option from @ref admin_opts "Administration Options". +int NWNX_Administration_GetPlayOption(int option); + +/// @brief Set an @ref admin_opts "Administration Options" to a value. +/// @param option The option to adjust from @ref admin_opts "Administration Options". +/// @param value The new value for the option. +void NWNX_Administration_SetPlayOption(int option, int value); + +/// @brief Delete the TURD of playerName + characterName. +/// +/// At times a PC may get stuck in a permanent crash loop when attempting to log +/// in. This function allows administrators to delete their Temporary User +/// Resource Data where the PC's current location is stored allowing them to log +/// into the starting area. +/// +/// @param playerName The community (login name). +/// @param characterName The character name. +/// @return Returns TRUE if successful +int NWNX_Administration_DeleteTURD(string playerName, string characterName); + +/// @brief Get an @ref admin_debug "Administration Debug Type" value. +/// @param type An @ref admin_debug "Administration Debug Type". +/// @return The current value for the supplied debug type from @ref admin_debug "Administration Debug Types". +int NWNX_Administration_GetDebugValue(int type); + +/// @brief Set an @ref admin_debug "Administration Debug Type" to a value. +/// @param type The debug type to adjust from @ref admin_debug "Administration Debug Types". +/// @param state The new state for the debug type, TRUE or FALSE +void NWNX_Administration_SetDebugValue(int type, int state); + +/// @brief Reload all rules (2da stuff etc). +/// @warning DANGER, DRAGONS. Bad things may or may not happen. +void NWNX_Administration_ReloadRules(); + +/// @} + +string NWNX_Administration_GetPlayerPassword() +{ + string sFunc = "GetPlayerPassword"; + + NWNX_CallFunction(NWNX_Administration, sFunc); + return NWNX_GetReturnValueString(NWNX_Administration, sFunc); +} + +void NWNX_Administration_SetPlayerPassword(string password) +{ + string sFunc = "SetPlayerPassword"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, password); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +void NWNX_Administration_ClearPlayerPassword() +{ + string sFunc = "ClearPlayerPassword"; + + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +string NWNX_Administration_GetDMPassword() +{ + string sFunc = "GetDMPassword"; + + NWNX_CallFunction(NWNX_Administration, sFunc); + return NWNX_GetReturnValueString(NWNX_Administration, sFunc); +} + +void NWNX_Administration_SetDMPassword(string password) +{ + string sFunc = "SetDMPassword"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, password); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +void NWNX_Administration_ShutdownServer() +{ + string sFunc = "ShutdownServer"; + + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +void NWNX_Administration_DeletePlayerCharacter(object oPC, int bPreserveBackup = TRUE, string sKickMessage = "") +{ + string sFunc = "DeletePlayerCharacter"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, sKickMessage); + NWNX_PushArgumentInt(NWNX_Administration, sFunc, bPreserveBackup); + NWNX_PushArgumentObject(NWNX_Administration, sFunc, oPC); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +void NWNX_Administration_AddBannedIP(string ip) +{ + string sFunc = "AddBannedIP"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, ip); + NWNX_CallFunction(NWNX_Administration, sFunc); +} +void NWNX_Administration_RemoveBannedIP(string ip) +{ + string sFunc = "RemoveBannedIP"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, ip); + NWNX_CallFunction(NWNX_Administration, sFunc); +} +void NWNX_Administration_AddBannedCDKey(string key) +{ + string sFunc = "AddBannedCDKey"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, key); + NWNX_CallFunction(NWNX_Administration, sFunc); +} +void NWNX_Administration_RemoveBannedCDKey(string key) +{ + string sFunc = "RemoveBannedCDKey"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, key); + NWNX_CallFunction(NWNX_Administration, sFunc); +} +void NWNX_Administration_AddBannedPlayerName(string playerName) +{ + string sFunc = "AddBannedPlayerName"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, playerName); + NWNX_CallFunction(NWNX_Administration, sFunc); +} +void NWNX_Administration_RemoveBannedPlayerName(string playerName) +{ + string sFunc = "RemoveBannedPlayerName"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, playerName); + NWNX_CallFunction(NWNX_Administration, sFunc); +} +string NWNX_Administration_GetBannedList() +{ + string sFunc = "GetBannedList"; + + NWNX_CallFunction(NWNX_Administration, sFunc); + return NWNX_GetReturnValueString(NWNX_Administration, sFunc); +} + +void NWNX_Administration_SetModuleName(string name) +{ + string sFunc = "SetModuleName"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, name); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +void NWNX_Administration_SetServerName(string name) +{ + string sFunc = "SetServerName"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, name); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +string NWNX_Administration_GetServerName() +{ + string sFunc = "GetServerName"; + NWNX_CallFunction(NWNX_Administration, sFunc); + return NWNX_GetReturnValueString(NWNX_Administration, sFunc); +} + +int NWNX_Administration_GetPlayOption(int option) +{ + string sFunc = "GetPlayOption"; + + NWNX_PushArgumentInt(NWNX_Administration, sFunc, option); + NWNX_CallFunction(NWNX_Administration, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Administration, sFunc); +} + +void NWNX_Administration_SetPlayOption(int option, int value) +{ + string sFunc = "SetPlayOption"; + + NWNX_PushArgumentInt(NWNX_Administration, sFunc, value); + NWNX_PushArgumentInt(NWNX_Administration, sFunc, option); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +int NWNX_Administration_DeleteTURD(string playerName, string characterName) +{ + string sFunc = "DeleteTURD"; + + NWNX_PushArgumentString(NWNX_Administration, sFunc, characterName); + NWNX_PushArgumentString(NWNX_Administration, sFunc, playerName); + NWNX_CallFunction(NWNX_Administration, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Administration, sFunc); +} + +int NWNX_Administration_GetDebugValue(int type) +{ + string sFunc = "GetDebugValue"; + + NWNX_PushArgumentInt(NWNX_Administration, sFunc, type); + NWNX_CallFunction(NWNX_Administration, sFunc); + + return NWNX_GetReturnValueInt(NWNX_Administration, sFunc); +} + +void NWNX_Administration_SetDebugValue(int type, int state) +{ + string sFunc = "SetDebugValue"; + + NWNX_PushArgumentInt(NWNX_Administration, sFunc, state); + NWNX_PushArgumentInt(NWNX_Administration, sFunc, type); + NWNX_CallFunction(NWNX_Administration, sFunc); +} + +void NWNX_Administration_ReloadRules() +{ + string sFunc = "ReloadRules"; + + NWNX_CallFunction(NWNX_Administration, sFunc); +} diff --git a/_module/nss/sql_db_partywide.nss b/_module/nss/sql_db_partywide.nss new file mode 100644 index 00000000..0a711f58 --- /dev/null +++ b/_module/nss/sql_db_partywide.nss @@ -0,0 +1,123 @@ +//::////////////////////////////////////////////////// +//:: SQL_DB_PARTYWIDE +/* + Modified x0_i0_partywide include library for + persistent party-wide database functions. + + */ +//::////////////////////////////////////////////////// +//:: Copyright (c) 2002 Floodgate Entertainment +//:: Created By: Naomi Novik +//:: Created On: 12/08/2002 +//:: Modified By: Jaysyn +//:: Modified On: 11/16/2022 +//::////////////////////////////////////////////////// + +#include "utl_i_sqluuid" + + +/********************************************************************** + * CONSTANTS + **********************************************************************/ + + +/********************************************************************** + * FUNCTION PROTOTYPES + **********************************************************************/ + +// Given a varname, value, and PC, sets the variable on +// all members of the PC's party. +// For strings. +void SQL_SetLocalStringOnAll(object oPC, string sVarname, string value); + +// Given a varname, value, and PC, sets the variable on +// all members of the PC's party. +// For ints. +void SQL_SetLocalIntOnAll(object oPC, string sVarname, int value); + +// Given a varname, value, and PC, sets the variable on +// all members of the PC's party. +// For floats. +void SQL_SetLocalFloatOnAll(object oPC, string sVarname, float value); + +// Given a varname, value, and PC, sets the variable on +// all members of the PC's party. +// For locations. +void SQL_SetLocalLocationOnAll(object oPC, string sVarname, location value); + +// Given a varname, value, and PC, sets the variable on +// all members of the PC's party. +// For objects. +void SQL_SetLocalObjectOnAll(object oPC, string sVarname, object value); + + +/********************************************************************** + * FUNCTION DEFINITIONS + **********************************************************************/ + + +// Given a varname, value, and PC, sets the variable on +// all members of the PC's party, including associates. +// For strings. +void SQL_SetLocalStringOnAll(object oPC, string sVarname, string value) +{ + object oPartyMem = GetFirstFactionMember(oPC, FALSE); + while (GetIsObjectValid(oPartyMem)) { + SQLocalsUUID_SetString(oPartyMem, sVarname, value); + oPartyMem = GetNextFactionMember(oPC, FALSE); + } +} + +// Given a varname, value, and PC, sets the variable on +// all members of the PC's party, including associates. +// For ints. +void SQL_SetLocalIntOnAll(object oPC, string sVarname, int value) +{ + object oPartyMem = GetFirstFactionMember(oPC, FALSE); + while (GetIsObjectValid(oPartyMem)) { + SQLocalsUUID_SetInt(oPartyMem, sVarname, value); + oPartyMem = GetNextFactionMember(oPC, FALSE); + } + +} + +// Given a varname, value, and PC, sets the variable on +// all members of the PC's party. +// For floats. +void SQL_SetLocalFloatOnAll(object oPC, string sVarname, float value) +{ + object oPartyMem = GetFirstFactionMember(oPC, FALSE); + while (GetIsObjectValid(oPartyMem)) { + SQLocalsUUID_SetFloat(oPartyMem, sVarname, value); + oPartyMem = GetNextFactionMember(oPC, FALSE); + } + +} + +// Given a varname, value, and PC, sets the variable on +// all members of the PC's party. +// For locations. +void SQL_SetLocalLocationOnAll(object oPC, string sVarname, location value) +{ + object oPartyMem = GetFirstFactionMember(oPC, FALSE); + while (GetIsObjectValid(oPartyMem)) { + SQLocalsUUID_SetLocation(oPartyMem, sVarname, value); + oPartyMem = GetNextFactionMember(oPC, FALSE); + } + +} + +// Given a varname, value, and PC, sets the variable on +// all members of the PC's party. +// For objects. +void SQL_SetLocalObjectOnAll(object oPC, string sVarname, object value) +{ + object oPartyMem = GetFirstFactionMember(oPC, FALSE); + while (GetIsObjectValid(oPartyMem)) { + SQLocalsUUID_SetObject(oPartyMem, sVarname, value); + oPartyMem = GetNextFactionMember(oPC, FALSE); + } + +} + +// void main (){} \ No newline at end of file diff --git a/_module/nss/utl_i_sqluuid.nss b/_module/nss/utl_i_sqluuid.nss new file mode 100644 index 00000000..01b3a980 --- /dev/null +++ b/_module/nss/utl_i_sqluuid.nss @@ -0,0 +1,668 @@ +//:://///////////////////////////////////////////// +//:: Utility Include: SQLocals Campaign +//:: utl_i_sqluuid.nss +//::////////////////////////////////////////////// +/* + Daz wrote these library functions to act as replacements for the usual local + functions: + * GetLocalInt / SetLocalInt / DeleteLocalInt + * GetLocalFloat / SetLocalFloat / DeleteLocalFloat + * GetLocalString / SetLocalString / DeleteLocalString + * GetLocalObject / SetLocalObject / DeleteLocalObject (NB: remember these are references NOT serialised objects) + * GetLocalLocation / SetLocalLocation / DeleteLocalLocation + * Plus a new function for saving just a vector by itself. + This version stores variables in the campaign DB using the UUID of the object as + the identifier, therefore it suggests only using this for oPlayer since their UUIDs + are persistent after server restarts. + Note for players existing OnClientLeave this is still valid, while the + versions in utl_i_sqlplayer is not. +*/ +//::////////////////////////////////////////////// +//:: Based off of the nwscript_utility_scripts project; see for dates/creator info +//:: https://github.com/Finaldeath/nwscript_utility_scripts +//::////////////////////////////////////////////// + +const string SQLLOCALUUID_DATABASE_NAME = "sqllocalsuuid_db"; + +const string SQLOCALSUUID_TABLE_NAME = "sqlocalsuuid_table"; + +const int SQLOCALSUUID_TYPE_ALL = 0; +const int SQLOCALSUUID_TYPE_INT = 1; +const int SQLOCALSUUID_TYPE_FLOAT = 2; +const int SQLOCALSUUID_TYPE_STRING = 4; +const int SQLOCALSUUID_TYPE_OBJECT = 8; +const int SQLOCALSUUID_TYPE_VECTOR = 16; +const int SQLOCALSUUID_TYPE_LOCATION = 32; + +// Returns an integer stored in the campaign DB for oPlayer, or 0 on error +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +int SQLocalsUUID_GetInt(object oPlayer, string sVarName); +// Sets an integer stored in the campaign DB for oPlayer to the given value +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to set +// * nValue - Value to store +void SQLocalsUUID_SetInt(object oPlayer, string sVarName, int nValue); +// Deletes an integer stored in the campaign DB for oPlayer +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to delete +void SQLocalsUUID_DeleteInt(object oPlayer, string sVarName); + +// Returns a float stored in the campaign DB for oPlayer, or 0.0 on error +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +float SQLocalsUUID_GetFloat(object oPlayer, string sVarName); +// Sets a float stored in the campaign DB for oPlayer to the given value +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to set +// * fValue - Value to store +void SQLocalsUUID_SetFloat(object oPlayer, string sVarName, float fValue); +// Deletes a float stored in the campaign DB for oPlayer +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to delete +void SQLocalsUUID_DeleteFloat(object oPlayer, string sVarName); + +// Returns an string stored in the campaign DB for oPlayer, or "" on error +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +string SQLocalsUUID_GetString(object oPlayer, string sVarName); +// Sets a string stored in the campaign DB for oPlayer to the given value +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to set +// * sValue - Value to store +void SQLocalsUUID_SetString(object oPlayer, string sVarName, string sValue); +// Deletes a string stored in the campaign DB for oPlayer +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to delete +void SQLocalsUUID_DeleteString(object oPlayer, string sVarName); + +// Returns an object identifier stored in the campaign DB for oPlayer +// If this is used on a player it might return a "once valid" OID, so check +// with GetIsObjectValid, do not compare to OBJECT_INVALID. +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +object SQLocalsUUID_GetObject(object oPlayer, string sVarName); +// Sets an object identifier stored in the campaign DB for oPlayer to the given value +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to set +// * oValue - Value to store +void SQLocalsUUID_SetObject(object oPlayer, string sVarName, object oValue); +// Deletes an object identifier stored in the campaign DB for oPlayer +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to delete +void SQLocalsUUID_DeleteObject(object oPlayer, string sVarName); + +// Returns a vector stored in the campaign DB for oPlayer, or [0.0, 0.0, 0.0] on error +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +vector SQLocalsUUID_GetVector(object oPlayer, string sVarName); +// Sets a vector stored in the campaign DB for oPlayer to the given value +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to set +// * vValue - Value to store +void SQLocalsUUID_SetVector(object oPlayer, string sVarName, vector vValue); +// Deletes a vector stored in the campaign DB for oPlayer +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to delete +void SQLocalsUUID_DeleteVector(object oPlayer, string sVarName); + +// Returns a location stored in the campaign DB for oPlayer, or the starting location of the module on error +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +location SQLocalsUUID_GetLocation(object oPlayer, string sVarName); +// Sets a location stored in the campaign DB for oPlayer to the given value +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to set +// * lValue - Value to store +void SQLocalsUUID_SetLocation(object oPlayer, string sVarName, location lValue); +// Deletes a location stored in the campaign DB for oPlayer +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to delete +void SQLocalsUUID_DeleteLocation(object oPlayer, string sVarName); + +// Deletes a set of locals stored in the campaign DB for oPlayer matching the given criteria +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * nType - The SQLOCALSUUID_TYPE_* you wish to remove (default: SQLOCALSUUID_TYPE_ALL) +// * sLike - The string to compare with the SQL "like" comparison +// * sEscape - The escape character to use with the SQL "escape" keyword +void SQLocalsUUID_Delete(object oPlayer, int nType = SQLOCALSUUID_TYPE_ALL, string sLike = "", string sEscape = ""); +// Counts a set of locals stored in the campaign DB for oPlayer matching the given criteria +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * nType - The SQLOCALSUUID_TYPE_* you wish to count (default: SQLOCALSUUID_TYPE_ALL) +// * sLike - The string to compare with the SQL "like" comparison +// * sEscape - The escape character to use with the SQL "escape" keyword +int SQLocalsUUID_Count(object oPlayer, int nType = SQLOCALSUUID_TYPE_ALL, string sLike = "", string sEscape = ""); +// Checks a locals stored in the campaign DB for oPlayer is set +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +// * nType - The SQLOCALSUUID_TYPE_* you wish to check +int SQLocalsUUID_IsSet(object oPlayer, string sVarName, int nType); +// Returns the last Unix time the given variable was updated +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +// * nType - The SQLOCALSUUID_TYPE_* you wish to check +int SQLocalsUUID_GetLastUpdated_UnixEpoch(object oPlayer, string sVarName, int nType); +// Returns the last UTC time the given variable was updated +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +// * nType - The SQLOCALSUUID_TYPE_* you wish to check +string SQLocalsUUID_GetLastUpdated_UTC(object oPlayer, string sVarName, int nType); + + +/* INTERNAL */ +void SQLocalsUUID_CreateTable() +{ + sqlquery sql = SqlPrepareQueryCampaign(SQLLOCALUUID_DATABASE_NAME, + "CREATE TABLE IF NOT EXISTS " + SQLOCALSUUID_TABLE_NAME + " (" + + "type INTEGER, " + + "uuid TEXT, " + + "varname TEXT, " + + "value TEXT, " + + "timestamp INTEGER, " + + "PRIMARY KEY(type, uuid, varname));"); + SqlStep(sql); +} + +sqlquery SQLocalsUUID_PrepareSelect(object oPlayer, int nType, string sVarName) +{ + SQLocalsUUID_CreateTable(); + + sqlquery sql = SqlPrepareQueryCampaign(SQLLOCALUUID_DATABASE_NAME, + "SELECT value FROM " + SQLOCALSUUID_TABLE_NAME + " " + + "WHERE type = @type AND uuid = @uuid AND varname = @varname;"); + + SqlBindInt(sql, "@type", nType); + SqlBindString(sql, "@uuid", GetObjectUUID(oPlayer)); + SqlBindString(sql, "@varname", sVarName); + + return sql; +} + +sqlquery SQLocalsUUID_PrepareInsert(object oPlayer, int nType, string sVarName) +{ + SQLocalsUUID_CreateTable(); + + sqlquery sql = SqlPrepareQueryCampaign(SQLLOCALUUID_DATABASE_NAME, + "INSERT INTO " + SQLOCALSUUID_TABLE_NAME + " " + + "(type, uuid, varname, value, timestamp) VALUES (@type, @uuid, @varname, @value, strftime('%s','now')) " + + "ON CONFLICT (type, uuid, varname) DO UPDATE SET value = @value, timestamp = strftime('%s','now');"); + + SqlBindInt(sql, "@type", nType); + SqlBindString(sql, "@uuid", GetObjectUUID(oPlayer)); + SqlBindString(sql, "@varname", sVarName); + + return sql; +} + +sqlquery SQLocalsUUID_PrepareDelete(object oPlayer, int nType, string sVarName) +{ + SQLocalsUUID_CreateTable(); + + sqlquery sql = SqlPrepareQueryCampaign(SQLLOCALUUID_DATABASE_NAME, + "DELETE FROM " + SQLOCALSUUID_TABLE_NAME + " " + + "WHERE type = @type AND uuid = @uuid AND varname = @varname;"); + + SqlBindInt(sql, "@type", nType); + SqlBindString(sql, "@uuid", GetObjectUUID(oPlayer)); + SqlBindString(sql, "@varname", sVarName); + + return sql; +} + +string SQLocalsUUID_LocationToString(location locLocation) +{ + string sAreaId = ObjectToString(GetAreaFromLocation(locLocation)); + vector vPosition = GetPositionFromLocation(locLocation); + float fFacing = GetFacingFromLocation(locLocation); + + return "#A#" + sAreaId + + "#X#" + FloatToString(vPosition.x, 0, 5) + + "#Y#" + FloatToString(vPosition.y, 0, 5) + + "#Z#" + FloatToString(vPosition.z, 0, 5) + + "#F#" + FloatToString(fFacing, 0, 5) + "#"; +} + +location SQLocalsUUID_StringToLocation(string sLocation) +{ + location locLocation; + + int nLength = GetStringLength(sLocation); + + if(nLength > 0) + { + int nPos, nCount; + + nPos = FindSubString(sLocation, "#A#") + 3; + nCount = FindSubString(GetSubString(sLocation, nPos, nLength - nPos), "#"); + object oArea = StringToObject(GetSubString(sLocation, nPos, nCount)); + + nPos = FindSubString(sLocation, "#X#") + 3; + nCount = FindSubString(GetSubString(sLocation, nPos, nLength - nPos), "#"); + float fX = StringToFloat(GetSubString(sLocation, nPos, nCount)); + + nPos = FindSubString(sLocation, "#Y#") + 3; + nCount = FindSubString(GetSubString(sLocation, nPos, nLength - nPos), "#"); + float fY = StringToFloat(GetSubString(sLocation, nPos, nCount)); + + nPos = FindSubString(sLocation, "#Z#") + 3; + nCount = FindSubString(GetSubString(sLocation, nPos, nLength - nPos), "#"); + float fZ = StringToFloat(GetSubString(sLocation, nPos, nCount)); + + vector vPosition = Vector(fX, fY, fZ); + + nPos = FindSubString(sLocation, "#F#") + 3; + nCount = FindSubString(GetSubString(sLocation, nPos, nLength - nPos), "#"); + float fOrientation = StringToFloat(GetSubString(sLocation, nPos, nCount)); + + if (GetIsObjectValid(oArea)) + locLocation = Location(oArea, vPosition, fOrientation); + else + locLocation = GetStartingLocation(); + } + + return locLocation; +} +/* **** */ + +/* INT */ + +// Returns an integer stored in the campaign DB for oPlayer, or 0 on error +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +int SQLocalsUUID_GetInt(object oPlayer, string sVarName) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return 0; + + sqlquery sql = SQLocalsUUID_PrepareSelect(oPlayer, SQLOCALSUUID_TYPE_INT, sVarName); + + if (SqlStep(sql)) + return SqlGetInt(sql, 0); + else + return 0; +} + +// Sets an integer stored in the campaign DB for oPlayer to the given value +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +// * nValue - Value to store +void SQLocalsUUID_SetInt(object oPlayer, string sVarName, int nValue) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return; + + sqlquery sql = SQLocalsUUID_PrepareInsert(oPlayer, SQLOCALSUUID_TYPE_INT, sVarName); + SqlBindInt(sql, "@value", nValue); + SqlStep(sql); +} + +// Deletes an integer stored in the campaign DB for oPlayer +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to delete +void SQLocalsUUID_DeleteInt(object oPlayer, string sVarName) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return; + + sqlquery sql = SQLocalsUUID_PrepareDelete(oPlayer, SQLOCALSUUID_TYPE_INT, sVarName); + SqlStep(sql); +} +/* **** */ + +/* FLOAT */ + +// Returns a float stored in the campaign DB for oPlayer, or 0.0 on error +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +float SQLocalsUUID_GetFloat(object oPlayer, string sVarName) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return 0.0f; + + sqlquery sql = SQLocalsUUID_PrepareSelect(oPlayer, SQLOCALSUUID_TYPE_FLOAT, sVarName); + + if (SqlStep(sql)) + return SqlGetFloat(sql, 0); + else + return 0.0f; +} + +// Sets a float stored in the campaign DB for oPlayer to the given value +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +// * fValue - Value to store +void SQLocalsUUID_SetFloat(object oPlayer, string sVarName, float fValue) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return; + + sqlquery sql = SQLocalsUUID_PrepareInsert(oPlayer, SQLOCALSUUID_TYPE_FLOAT, sVarName); + SqlBindFloat(sql, "@value", fValue); + SqlStep(sql); +} + +// Deletes a float stored in the campaign DB for oPlayer +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to delete +void SQLocalsUUID_DeleteFloat(object oPlayer, string sVarName) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return; + + sqlquery sql = SQLocalsUUID_PrepareDelete(oPlayer, SQLOCALSUUID_TYPE_FLOAT, sVarName); + SqlStep(sql); +} +/* **** */ + +/* STRING */ + +// Returns an string stored in the campaign DB for oPlayer, or "" on error +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +string SQLocalsUUID_GetString(object oPlayer, string sVarName) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return ""; + + sqlquery sql = SQLocalsUUID_PrepareSelect(oPlayer, SQLOCALSUUID_TYPE_STRING, sVarName); + + if (SqlStep(sql)) + return SqlGetString(sql, 0); + else + return ""; +} + +// Sets a string stored in the campaign DB for oPlayer to the given value +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +// * sValue - Value to store +void SQLocalsUUID_SetString(object oPlayer, string sVarName, string sValue) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return; + + sqlquery sql = SQLocalsUUID_PrepareInsert(oPlayer, SQLOCALSUUID_TYPE_STRING, sVarName); + SqlBindString(sql, "@value", sValue); + SqlStep(sql); +} + +// Deletes a string stored in the campaign DB for oPlayer +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to delete +void SQLocalsUUID_DeleteString(object oPlayer, string sVarName) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return; + + sqlquery sql = SQLocalsUUID_PrepareDelete(oPlayer, SQLOCALSUUID_TYPE_STRING, sVarName); + SqlStep(sql); +} +/* **** */ + +/* OBJECT */ + + +// Returns an object identifier stored in the campaign DB for oPlayer +// If this is used on a player it might return a "once valid" OID, so check +// with GetIsObjectValid, do not compare to OBJECT_INVALID. +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +object SQLocalsUUID_GetObject(object oPlayer, string sVarName) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return OBJECT_INVALID; + + sqlquery sql = SQLocalsUUID_PrepareSelect(oPlayer, SQLOCALSUUID_TYPE_OBJECT, sVarName); + + if (SqlStep(sql)) + return StringToObject(SqlGetString(sql, 0)); + else + return OBJECT_INVALID; +} + +// Sets an object identifier stored in the campaign DB for oPlayer to the given value +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +// * oValue - Value to store +void SQLocalsUUID_SetObject(object oPlayer, string sVarName, object oValue) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return; + + sqlquery sql = SQLocalsUUID_PrepareInsert(oPlayer, SQLOCALSUUID_TYPE_OBJECT, sVarName); + SqlBindString(sql, "@value", ObjectToString(oValue)); + SqlStep(sql); +} + +// Deletes an object identifier stored in the campaign DB for oPlayer +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to delete +void SQLocalsUUID_DeleteObject(object oPlayer, string sVarName) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return; + + sqlquery sql = SQLocalsUUID_PrepareDelete(oPlayer, SQLOCALSUUID_TYPE_OBJECT, sVarName); + SqlStep(sql); +} +/* **** */ + +/* VECTOR */ + +// Returns a vector stored in the campaign DB for oPlayer, or [0.0, 0.0, 0.0] on error +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +vector SQLocalsUUID_GetVector(object oPlayer, string sVarName) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return [0.0f, 0.0f, 0.0f]; + + sqlquery sql = SQLocalsUUID_PrepareSelect(oPlayer, SQLOCALSUUID_TYPE_VECTOR, sVarName); + + if (SqlStep(sql)) + return SqlGetVector(sql, 0); + else + return [0.0f, 0.0f, 0.0f]; +} + +// Sets a vector stored in the campaign DB for oPlayer to the given value +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +// * vValue - Value to store +void SQLocalsUUID_SetVector(object oPlayer, string sVarName, vector vValue) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return; + + sqlquery sql = SQLocalsUUID_PrepareInsert(oPlayer, SQLOCALSUUID_TYPE_VECTOR, sVarName); + SqlBindVector(sql, "@value", vValue); + SqlStep(sql); +} + +// Deletes a vector stored in the campaign DB for oPlayer +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to delete +void SQLocalsUUID_DeleteVector(object oPlayer, string sVarName) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return; + + sqlquery sql = SQLocalsUUID_PrepareDelete(oPlayer, SQLOCALSUUID_TYPE_VECTOR, sVarName); + SqlStep(sql); +} +/* **** */ + +/* LOCATION */ + +// Returns a location stored in the campaign DB for oPlayer, or the starting location of the module on error +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +location SQLocalsUUID_GetLocation(object oPlayer, string sVarName) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return GetStartingLocation(); + + sqlquery sql = SQLocalsUUID_PrepareSelect(oPlayer, SQLOCALSUUID_TYPE_LOCATION, sVarName); + + if (SqlStep(sql)) + return SQLocalsUUID_StringToLocation(SqlGetString(sql, 0)); + else + return GetStartingLocation(); +} + +// Sets a location stored in the campaign DB for oPlayer to the given value +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +// * lValue - Value to store +void SQLocalsUUID_SetLocation(object oPlayer, string sVarName, location lValue) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return; + + sqlquery sql = SQLocalsUUID_PrepareInsert(oPlayer, SQLOCALSUUID_TYPE_LOCATION, sVarName); + SqlBindString(sql, "@value", SQLocalsUUID_LocationToString(lValue)); + SqlStep(sql); +} + +// Deletes a location stored in the campaign DB for oPlayer +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to delete +void SQLocalsUUID_DeleteLocation(object oPlayer, string sVarName) +{ + if (!GetIsPC(oPlayer) || sVarName == "") return; + + sqlquery sql = SQLocalsUUID_PrepareDelete(oPlayer, SQLOCALSUUID_TYPE_LOCATION, sVarName); + SqlStep(sql); +} +/* **** */ + +/* UTILITY */ + +// Deletes a set of locals stored in the campaign DB for oPlayer matching the given criteria +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * nType - The SQLOCALSUUID_TYPE_* you wish to remove (default: SQLOCALSUUID_TYPE_ALL) +// * sLike - The string to compare with the SQL "like" comparison +// * sEscape - The escape character to use with the SQL "escape" keyword +void SQLocalsUUID_Delete(object oPlayer, int nType = SQLOCALSUUID_TYPE_ALL, string sLike = "", string sEscape = "") +{ + if (!GetIsPC(oPlayer) || nType < 0) return; + + SQLocalsUUID_CreateTable(); + + sqlquery sql = SqlPrepareQueryCampaign(SQLLOCALUUID_DATABASE_NAME, + "DELETE FROM " + SQLOCALSUUID_TABLE_NAME + " " + + "WHERE uuid = @uuid" + + (nType != SQLOCALSUUID_TYPE_ALL ? "AND type & @type " : " ") + + (sLike != "" ? "AND varname LIKE @like " + (sEscape != "" ? "ESCAPE @escape" : "") : "") + + ";"); + + SqlBindString(sql, "@uuid", GetObjectUUID(oPlayer)); + + if (nType != SQLOCALSUUID_TYPE_ALL) + SqlBindInt(sql, "@type", nType); + if (sLike != "") + { + SqlBindString(sql, "@like", sLike); + + if (sEscape != "") + SqlBindString(sql, "@escape", sEscape); + } + + SqlStep(sql); +} + +// Counts a set of locals stored in the campaign DB for oPlayer matching the given criteria +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * nType - The SQLOCALSUUID_TYPE_* you wish to count (default: SQLOCALSUUID_TYPE_ALL) +// * sLike - The string to compare with the SQL "like" comparison +// * sEscape - The escape character to use with the SQL "escape" keyword +int SQLocalsUUID_Count(object oPlayer, int nType = SQLOCALSUUID_TYPE_ALL, string sLike = "", string sEscape = "") +{ + if (!GetIsPC(oPlayer) || nType < 0) return 0; + + SQLocalsUUID_CreateTable(); + + sqlquery sql = SqlPrepareQueryObject(oPlayer, + "SELECT COUNT(*) FROM " + SQLOCALSUUID_TABLE_NAME + " " + + "WHERE uuid = @uuid " + + (nType != SQLOCALSUUID_TYPE_ALL ? "AND type & @type " : " ") + + (sLike != "" ? "AND varname LIKE @like " + (sEscape != "" ? "ESCAPE @escape" : "") : "") + + ";"); + + SqlBindString(sql, "@uuid", GetObjectUUID(oPlayer)); + + if (nType != SQLOCALSUUID_TYPE_ALL) + SqlBindInt(sql, "@type", nType); + if (sLike != "") + { + SqlBindString(sql, "@like", sLike); + + if (sEscape != "") + SqlBindString(sql, "@escape", sEscape); + } + + if (SqlStep(sql)) + return SqlGetInt(sql, 0); + else + return 0; +} + +// Checks a locals stored in the campaign DB for oPlayer is set +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +// * nType - The SQLOCALSUUID_TYPE_* you wish to check (default: SQLOCALSUUID_TYPE_ALL) +int SQLocalsUUID_IsSet(object oPlayer, string sVarName, int nType) +{ + if (!GetIsPC(oPlayer) || nType < 0) return 0; + + SQLocalsUUID_CreateTable(); + + sqlquery sql = SqlPrepareQueryObject(oPlayer, + "SELECT * FROM " + SQLOCALSUUID_TABLE_NAME + " " + + "WHERE uuid = @uuid " + + (nType != SQLOCALSUUID_TYPE_ALL ? "AND type & @type " : " ") + + "AND varname = @varname;"); + + SqlBindString(sql, "@uuid", GetObjectUUID(oPlayer)); + + if (nType != SQLOCALSUUID_TYPE_ALL) + SqlBindInt(sql, "@type", nType); + SqlBindString(sql, "@varname", sVarName); + + return SqlStep(sql); +} + +// Returns the last Unix time the given variable was updated +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +// * nType - The SQLOCALSUUID_TYPE_* you wish to check (default: SQLOCALSUUID_TYPE_ALL) +int SQLocalsUUID_GetLastUpdated_UnixEpoch(object oPlayer, string sVarName, int nType) +{ + if (!GetIsPC(oPlayer) || nType <= 0) return 0; + + SQLocalsUUID_CreateTable(); + + sqlquery sql = SqlPrepareQueryObject(oPlayer, + "SELECT timestamp FROM " + SQLOCALSUUID_TABLE_NAME + " " + + "WHERE type = @type " + + "AND uuid = @uuid" + + "AND varname = @varname;"); + + SqlBindInt(sql, "@type", nType); + SqlBindString(sql, "@uuid", GetObjectUUID(oPlayer)); + SqlBindString(sql, "@varname", sVarName); + + if (SqlStep(sql)) + return SqlGetInt(sql, 0); + else + return 0; +} + +// Returns the last UTC time the given variable was updated +// * oPlayer - a player object (uses GetObjectUUID to identify) +// * sVarName - name of the variable to retrieve +// * nType - The SQLOCALSUUID_TYPE_* you wish to check (default: SQLOCALSUUID_TYPE_ALL) +string SQLocalsUUID_GetLastUpdated_UTC(object oPlayer, string sVarName, int nType) +{ + if (!GetIsPC(oPlayer) || nType <= 0) return ""; + + SQLocalsUUID_CreateTable(); + + sqlquery sql = SqlPrepareQueryObject(oPlayer, + "SELECT datetime(timestamp, 'unixepoch') FROM " + SQLOCALSUUID_TABLE_NAME + " " + + "WHERE type = @type " + + "AND uuid = @uuid" + + "AND varname = @varname;"); + + SqlBindInt(sql, "@type", nType); + SqlBindString(sql, "@uuid", GetObjectUUID(oPlayer)); + SqlBindString(sql, "@varname", sVarName); + + if (SqlStep(sql)) + return SqlGetString(sql, 0); + else + return ""; +} \ No newline at end of file diff --git a/_module/utc/npc_annihilus.utc.json b/_module/utc/npc_annihilus.utc.json new file mode 100644 index 00000000..8a681502 --- /dev/null +++ b/_module/utc/npc_annihilus.utc.json @@ -0,0 +1,1346 @@ +{ + "__data_type": "UTC ", + "Appearance_Head": { + "type": "byte", + "value": 14 + }, + "Appearance_Type": { + "type": "word", + "value": 1 + }, + "ArmorPart_RFoot": { + "type": "byte", + "value": 1 + }, + "BodyBag": { + "type": "byte", + "value": 0 + }, + "BodyPart_Belt": { + "type": "byte", + "value": 0 + }, + "BodyPart_LBicep": { + "type": "byte", + "value": 1 + }, + "BodyPart_LFArm": { + "type": "byte", + "value": 1 + }, + "BodyPart_LFoot": { + "type": "byte", + "value": 1 + }, + "BodyPart_LHand": { + "type": "byte", + "value": 1 + }, + "BodyPart_LShin": { + "type": "byte", + "value": 1 + }, + "BodyPart_LShoul": { + "type": "byte", + "value": 0 + }, + "BodyPart_LThigh": { + "type": "byte", + "value": 1 + }, + "BodyPart_Neck": { + "type": "byte", + "value": 1 + }, + "BodyPart_Pelvis": { + "type": "byte", + "value": 1 + }, + "BodyPart_RBicep": { + "type": "byte", + "value": 1 + }, + "BodyPart_RFArm": { + "type": "byte", + "value": 1 + }, + "BodyPart_RHand": { + "type": "byte", + "value": 1 + }, + "BodyPart_RShin": { + "type": "byte", + "value": 1 + }, + "BodyPart_RShoul": { + "type": "byte", + "value": 0 + }, + "BodyPart_RThigh": { + "type": "byte", + "value": 1 + }, + "BodyPart_Torso": { + "type": "byte", + "value": 1 + }, + "Cha": { + "type": "byte", + "value": 18 + }, + "ChallengeRating": { + "type": "float", + "value": 50.0 + }, + "ClassList": { + "type": "list", + "value": [ + { + "__struct_id": 2, + "Class": { + "type": "int", + "value": 5 + }, + "ClassLevel": { + "type": "short", + "value": 1 + } + }, + { + "__struct_id": 2, + "Class": { + "type": "int", + "value": 1 + }, + "ClassLevel": { + "type": "short", + "value": 1 + }, + "KnownList0": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 33 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 37 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 100 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 151 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + }, + "KnownList1": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 442 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 436 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 66 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 102 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + }, + "KnownList2": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 9 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 13 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 21 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 36 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 163 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + }, + "KnownList3": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 20 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 545 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 78 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 539 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 441 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + }, + "KnownList4": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 31 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 82 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 88 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 373 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + }, + "KnownList5": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 121 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 67 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 80 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 118 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 179 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + }, + "KnownList6": { + "type": "list", + "value": [ + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 445 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 369 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 113 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 3, + "Spell": { + "type": "word", + "value": 180 + }, + "SpellFlags": { + "type": "byte", + "value": 1 + }, + "SpellMetaMagic": { + "type": "byte", + "value": 0 + } + } + ] + } + }, + { + "__struct_id": 2, + "Class": { + "type": "int", + "value": 31 + }, + "ClassLevel": { + "type": "short", + "value": 1 + } + } + ] + }, + "Color_Hair": { + "type": "byte", + "value": 17 + }, + "Color_Skin": { + "type": "byte", + "value": 2 + }, + "Color_Tattoo1": { + "type": "byte", + "value": 67 + }, + "Color_Tattoo2": { + "type": "byte", + "value": 104 + }, + "Comment": { + "type": "cexostring", + "value": "Annihilus" + }, + "Con": { + "type": "byte", + "value": 12 + }, + "Conversation": { + "type": "resref", + "value": "hs_del_pc" + }, + "CRAdjust": { + "type": "int", + "value": 0 + }, + "CurrentHitPoints": { + "type": "short", + "value": 308 + }, + "DecayTime": { + "type": "dword", + "value": 10000 + }, + "Deity": { + "type": "cexostring", + "value": "" + }, + "Description": { + "type": "cexolocstring", + "value": { + "0": "Talk to this person if you need to delete or relevel your character." + } + }, + "Dex": { + "type": "byte", + "value": 22 + }, + "Disarmable": { + "type": "byte", + "value": 0 + }, + "Equip_ItemList": { + "type": "list", + "value": [ + { + "__struct_id": 2, + "EquippedRes": { + "type": "resref", + "value": "desertnomadarmor" + } + } + ] + }, + "FactionID": { + "type": "word", + "value": 3 + }, + "FeatList": { + "type": "list", + "value": [ + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 2 + } + }, + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 3 + } + }, + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 4 + } + }, + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 32 + } + }, + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 45 + } + }, + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 49 + } + }, + { + "__struct_id": 1, + "Feat": { + "type": "word", + "value": 46 + } + } + ] + }, + "FirstName": { + "type": "cexolocstring", + "value": { + "0": "Lotran" + } + }, + "fortbonus": { + "type": "short", + "value": 0 + }, + "Gender": { + "type": "byte", + "value": 4 + }, + "GoodEvil": { + "type": "byte", + "value": 50 + }, + "HitPoints": { + "type": "short", + "value": 308 + }, + "Int": { + "type": "byte", + "value": 12 + }, + "Interruptable": { + "type": "byte", + "value": 1 + }, + "IsImmortal": { + "type": "byte", + "value": 1 + }, + "IsPC": { + "type": "byte", + "value": 0 + }, + "LastName": { + "type": "cexolocstring", + "value": { + "0": "" + } + }, + "LawfulChaotic": { + "type": "byte", + "value": 50 + }, + "Lootable": { + "type": "byte", + "value": 0 + }, + "MaxHitPoints": { + "type": "short", + "value": 308 + }, + "NaturalAC": { + "type": "byte", + "value": 0 + }, + "NoPermDeath": { + "type": "byte", + "value": 1 + }, + "PaletteID": { + "type": "byte", + "value": 1 + }, + "PerceptionRange": { + "type": "byte", + "value": 8 + }, + "Phenotype": { + "type": "int", + "value": 0 + }, + "Plot": { + "type": "byte", + "value": 1 + }, + "PortraitId": { + "type": "word", + "value": 2259 + }, + "Race": { + "type": "byte", + "value": 1 + }, + "refbonus": { + "type": "short", + "value": 0 + }, + "ScriptAttacked": { + "type": "resref", + "value": "x2_def_attacked" + }, + "ScriptDamaged": { + "type": "resref", + "value": "x2_def_ondamage" + }, + "ScriptDeath": { + "type": "resref", + "value": "x2_def_ondeath" + }, + "ScriptDialogue": { + "type": "resref", + "value": "x2_def_onconv" + }, + "ScriptDisturbed": { + "type": "resref", + "value": "x2_def_ondisturb" + }, + "ScriptEndRound": { + "type": "resref", + "value": "x2_def_endcombat" + }, + "ScriptHeartbeat": { + "type": "resref", + "value": "x2_def_heartbeat" + }, + "ScriptOnBlocked": { + "type": "resref", + "value": "x2_def_onblocked" + }, + "ScriptOnNotice": { + "type": "resref", + "value": "" + }, + "ScriptRested": { + "type": "resref", + "value": "x2_def_rested" + }, + "ScriptSpawn": { + "type": "resref", + "value": "x2_def_spawn" + }, + "ScriptSpellAt": { + "type": "resref", + "value": "x2_def_spellcast" + }, + "ScriptUserDefine": { + "type": "resref", + "value": "x2_def_userdef" + }, + "SkillList": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 19 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 43 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 5 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 43 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 43 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 30 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 1 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 26 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 40 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + }, + { + "__struct_id": 0, + "Rank": { + "type": "byte", + "value": 0 + } + } + ] + }, + "SoundSetFile": { + "type": "word", + "value": 132 + }, + "SpecAbilityList": { + "type": "list", + "value": [] + }, + "StartingPackage": { + "type": "byte", + "value": 43 + }, + "Str": { + "type": "byte", + "value": 14 + }, + "Subrace": { + "type": "cexostring", + "value": "" + }, + "Tag": { + "type": "cexostring", + "value": "Lotran" + }, + "Tail_New": { + "type": "dword", + "value": 0 + }, + "TemplateList": { + "type": "list", + "value": [] + }, + "TemplateResRef": { + "type": "resref", + "value": "npc_annihilus" + }, + "VarTable": { + "type": "list", + "value": [ + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "SET_NAME" + }, + "Type": { + "type": "dword", + "value": 3 + }, + "Value": { + "type": "cexostring", + "value": "Annihilus" + } + }, + { + "__struct_id": 0, + "Name": { + "type": "cexostring", + "value": "GLOW_COLOR" + }, + "Type": { + "type": "dword", + "value": 1 + }, + "Value": { + "type": "int", + "value": 13 + } + } + ] + }, + "WalkRate": { + "type": "int", + "value": 5 + }, + "willbonus": { + "type": "short", + "value": 0 + }, + "Wings_New": { + "type": "dword", + "value": 0 + }, + "Wis": { + "type": "byte", + "value": 8 + }, + "xAppearance_Head": { + "type": "word", + "value": 14 + }, + "xArmorPart_RFoot": { + "type": "word", + "value": 1 + }, + "xBodyPart_Belt": { + "type": "word", + "value": 0 + }, + "xBodyPart_LBicep": { + "type": "word", + "value": 1 + }, + "xBodyPart_LFArm": { + "type": "word", + "value": 1 + }, + "xBodyPart_LFoot": { + "type": "word", + "value": 1 + }, + "xBodyPart_LHand": { + "type": "word", + "value": 1 + }, + "xBodyPart_LShin": { + "type": "word", + "value": 1 + }, + "xBodyPart_LShoul": { + "type": "word", + "value": 0 + }, + "xBodyPart_LThigh": { + "type": "word", + "value": 1 + }, + "xBodyPart_Neck": { + "type": "word", + "value": 1 + }, + "xBodyPart_Pelvis": { + "type": "word", + "value": 1 + }, + "xBodyPart_RBicep": { + "type": "word", + "value": 1 + }, + "xBodyPart_RFArm": { + "type": "word", + "value": 1 + }, + "xBodyPart_RHand": { + "type": "word", + "value": 1 + }, + "xBodyPart_RShin": { + "type": "word", + "value": 1 + }, + "xBodyPart_RShoul": { + "type": "word", + "value": 0 + }, + "xBodyPart_RThigh": { + "type": "word", + "value": 1 + }, + "xBodyPart_Torso": { + "type": "word", + "value": 1 + } +} diff --git a/_module/uti/item013.uti.json b/_module/uti/item013.uti.json new file mode 100644 index 00000000..4de139a9 --- /dev/null +++ b/_module/uti/item013.uti.json @@ -0,0 +1,81 @@ +{ + "__data_type": "UTI ", + "AddCost": { + "type": "dword", + "value": 0 + }, + "BaseItem": { + "type": "int", + "value": 207 + }, + "Charges": { + "type": "byte", + "value": 0 + }, + "Comment": { + "type": "cexostring", + "value": "" + }, + "Cost": { + "type": "dword", + "value": 0 + }, + "Cursed": { + "type": "byte", + "value": 0 + }, + "DescIdentified": { + "type": "cexolocstring", + "value": {} + }, + "Description": { + "type": "cexolocstring", + "value": {} + }, + "Identified": { + "type": "byte", + "value": 1 + }, + "LocalizedName": { + "type": "cexolocstring", + "value": { + "0": "Gobling Ear - Left" + } + }, + "ModelPart1": { + "type": "byte", + "value": 18 + }, + "PaletteID": { + "type": "byte", + "value": 130 + }, + "Plot": { + "type": "byte", + "value": 0 + }, + "PropertiesList": { + "type": "list", + "value": [] + }, + "StackSize": { + "type": "word", + "value": 10 + }, + "Stolen": { + "type": "byte", + "value": 0 + }, + "Tag": { + "type": "cexostring", + "value": "GoblingEarLeft" + }, + "TemplateResRef": { + "type": "resref", + "value": "item013" + }, + "xModelPart1": { + "type": "word", + "value": 18 + } +} diff --git a/_release/Aantioch [PRC-CEP3].7z b/_release/Aantioch [PRC-CEP3].7z index 5416401d..ec4dd24e 100644 Binary files a/_release/Aantioch [PRC-CEP3].7z and b/_release/Aantioch [PRC-CEP3].7z differ