2025/09/07 Update
Added Amulet of Mighty Fists +1 thru +5. Added Greenbound template. Fixed Evolved & Paragon templates. Updated several area names.
This commit is contained in:
parent
1771fadbad
commit
0b5b6912d2
@ -87,7 +87,7 @@
|
||||
"Name": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Alchemists Shop"
|
||||
"0": "Town of Ascension: Alchemists Shop"
|
||||
}
|
||||
},
|
||||
"NoRest": {
|
||||
@ -552,7 +552,7 @@
|
||||
},
|
||||
"Version": {
|
||||
"type": "dword",
|
||||
"value": 127
|
||||
"value": 129
|
||||
},
|
||||
"Width": {
|
||||
"type": "int",
|
||||
|
@ -87,7 +87,7 @@
|
||||
"Name": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Armor Shop"
|
||||
"0": "Town of Ascension: Armor Shop"
|
||||
}
|
||||
},
|
||||
"NoRest": {
|
||||
@ -413,13 +413,17 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"TileBrdrDisabled": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tileset": {
|
||||
"type": "resref",
|
||||
"value": "tin01"
|
||||
},
|
||||
"Version": {
|
||||
"type": "dword",
|
||||
"value": 55
|
||||
"value": 56
|
||||
},
|
||||
"Width": {
|
||||
"type": "int",
|
||||
|
@ -87,7 +87,7 @@
|
||||
"Name": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Ascension Sewer"
|
||||
"0": "Town of Ascension: Sewers"
|
||||
}
|
||||
},
|
||||
"NoRest": {
|
||||
@ -2907,13 +2907,17 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"TileBrdrDisabled": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tileset": {
|
||||
"type": "resref",
|
||||
"value": "tds01"
|
||||
},
|
||||
"Version": {
|
||||
"type": "dword",
|
||||
"value": 27
|
||||
"value": 28
|
||||
},
|
||||
"Width": {
|
||||
"type": "int",
|
||||
|
@ -87,7 +87,7 @@
|
||||
"Name": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Cellar"
|
||||
"0": "Town of Ascension: Cellar"
|
||||
}
|
||||
},
|
||||
"NoRest": {
|
||||
@ -1187,13 +1187,17 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"TileBrdrDisabled": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tileset": {
|
||||
"type": "resref",
|
||||
"value": "tic01"
|
||||
},
|
||||
"Version": {
|
||||
"type": "dword",
|
||||
"value": 7
|
||||
"value": 8
|
||||
},
|
||||
"Width": {
|
||||
"type": "int",
|
||||
|
@ -87,7 +87,7 @@
|
||||
"Name": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Item Shop"
|
||||
"0": "Town of Ascension: Item Shop"
|
||||
}
|
||||
},
|
||||
"NoRest": {
|
||||
@ -413,13 +413,17 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"TileBrdrDisabled": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tileset": {
|
||||
"type": "resref",
|
||||
"value": "tin01"
|
||||
},
|
||||
"Version": {
|
||||
"type": "dword",
|
||||
"value": 44
|
||||
"value": 45
|
||||
},
|
||||
"Width": {
|
||||
"type": "int",
|
||||
|
@ -87,7 +87,7 @@
|
||||
"Name": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Merchant's Emporium"
|
||||
"0": "Town of Ascension: Merchant's Emporium"
|
||||
}
|
||||
},
|
||||
"NoRest": {
|
||||
@ -1015,13 +1015,17 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"TileBrdrDisabled": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tileset": {
|
||||
"type": "resref",
|
||||
"value": "tin01"
|
||||
},
|
||||
"Version": {
|
||||
"type": "dword",
|
||||
"value": 51
|
||||
"value": 53
|
||||
},
|
||||
"Width": {
|
||||
"type": "int",
|
||||
|
@ -87,7 +87,7 @@
|
||||
"Name": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Overspawning Jail"
|
||||
"0": "| Overspawning Jail |"
|
||||
}
|
||||
},
|
||||
"NoRest": {
|
||||
@ -843,13 +843,17 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"TileBrdrDisabled": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tileset": {
|
||||
"type": "resref",
|
||||
"value": "tic01"
|
||||
},
|
||||
"Version": {
|
||||
"type": "dword",
|
||||
"value": 9
|
||||
"value": 10
|
||||
},
|
||||
"Width": {
|
||||
"type": "int",
|
||||
|
@ -87,7 +87,7 @@
|
||||
"Name": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Sage's Home"
|
||||
"0": "Town of Ascension: Sage's Home"
|
||||
}
|
||||
},
|
||||
"NoRest": {
|
||||
@ -542,13 +542,17 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"TileBrdrDisabled": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tileset": {
|
||||
"type": "resref",
|
||||
"value": "tic01"
|
||||
},
|
||||
"Version": {
|
||||
"type": "dword",
|
||||
"value": 37
|
||||
"value": 38
|
||||
},
|
||||
"Width": {
|
||||
"type": "int",
|
||||
|
@ -6357,7 +6357,7 @@
|
||||
},
|
||||
"Version": {
|
||||
"type": "dword",
|
||||
"value": 522
|
||||
"value": 525
|
||||
},
|
||||
"Width": {
|
||||
"type": "int",
|
||||
|
@ -87,7 +87,7 @@
|
||||
"Name": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Trespasser's Tavern"
|
||||
"0": "Town of Ascension: Trespasser's Tavern"
|
||||
}
|
||||
},
|
||||
"NoRest": {
|
||||
@ -1230,13 +1230,17 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"TileBrdrDisabled": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tileset": {
|
||||
"type": "resref",
|
||||
"value": "tin01"
|
||||
},
|
||||
"Version": {
|
||||
"type": "dword",
|
||||
"value": 209
|
||||
"value": 210
|
||||
},
|
||||
"Width": {
|
||||
"type": "int",
|
||||
|
@ -87,7 +87,7 @@
|
||||
"Name": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Weapons Shop"
|
||||
"0": "Town of Ascension: Weapons Shop"
|
||||
}
|
||||
},
|
||||
"NoRest": {
|
||||
@ -413,13 +413,17 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
"TileBrdrDisabled": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tileset": {
|
||||
"type": "resref",
|
||||
"value": "tin01"
|
||||
},
|
||||
"Version": {
|
||||
"type": "dword",
|
||||
"value": 37
|
||||
"value": 38
|
||||
},
|
||||
"Width": {
|
||||
"type": "int",
|
||||
|
@ -2957,7 +2957,7 @@
|
||||
"__struct_id": 2,
|
||||
"Orientation": {
|
||||
"type": "float",
|
||||
"value": -3.092489242553711
|
||||
"value": -3.092488765716553
|
||||
},
|
||||
"X": {
|
||||
"type": "float",
|
||||
@ -3182,7 +3182,7 @@
|
||||
"__struct_id": 2,
|
||||
"Orientation": {
|
||||
"type": "float",
|
||||
"value": 3.092488765716553
|
||||
"value": 3.092488288879395
|
||||
},
|
||||
"X": {
|
||||
"type": "float",
|
||||
@ -5267,7 +5267,7 @@
|
||||
"__struct_id": 2,
|
||||
"Orientation": {
|
||||
"type": "float",
|
||||
"value": 3.092488765716553
|
||||
"value": 3.092488288879395
|
||||
},
|
||||
"X": {
|
||||
"type": "float",
|
||||
@ -5815,7 +5815,7 @@
|
||||
"__struct_id": 2,
|
||||
"Orientation": {
|
||||
"type": "float",
|
||||
"value": -3.092489242553711
|
||||
"value": -3.092488765716553
|
||||
},
|
||||
"X": {
|
||||
"type": "float",
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -13450,11 +13450,11 @@
|
||||
},
|
||||
"X": {
|
||||
"type": "float",
|
||||
"value": 71.30510711669922
|
||||
"value": 71.24748992919922
|
||||
},
|
||||
"Y": {
|
||||
"type": "float",
|
||||
"value": 75.04737854003906
|
||||
"value": 75.09403228759766
|
||||
},
|
||||
"Z": {
|
||||
"type": "float",
|
||||
@ -27841,7 +27841,7 @@
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "NW_WAYPOINT001"
|
||||
"value": "NW_MAP_MAGIC"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
@ -27905,7 +27905,7 @@
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "NW_WAYPOINT001"
|
||||
"value": "NW_MAP_WEAPONS"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
@ -27969,7 +27969,7 @@
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "NW_WAYPOINT001"
|
||||
"value": "NW_MAP_ARMOR"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
@ -28033,7 +28033,7 @@
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "NW_WAYPOINT001"
|
||||
"value": "NW_MAP_TAVERN"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
@ -30253,7 +30253,7 @@
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "NW_WAYPOINT001"
|
||||
"value": "NW_MAP_CLOTHES"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
@ -30317,7 +30317,7 @@
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "NW_WAYPOINT001"
|
||||
"value": "NW_MAP_SAGE"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
@ -30372,7 +30372,7 @@
|
||||
"MapNote": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Merchants Emporium"
|
||||
"0": "Merchant's Emporium"
|
||||
}
|
||||
},
|
||||
"MapNoteEnabled": {
|
||||
@ -30381,7 +30381,7 @@
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "NW_WAYPOINT001"
|
||||
"value": "NW_MAP_MERCHANTS"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
@ -31209,6 +31209,7 @@
|
||||
"LocalizedName": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Map Note",
|
||||
"id": 14814
|
||||
}
|
||||
},
|
||||
@ -31225,7 +31226,7 @@
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "NW_MAPNOTE001"
|
||||
"value": "NW_MAP_BANK"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
@ -31237,7 +31238,7 @@
|
||||
},
|
||||
"XPosition": {
|
||||
"type": "float",
|
||||
"value": 69.18457794189453
|
||||
"value": 69.61856842041016
|
||||
},
|
||||
"YOrientation": {
|
||||
"type": "float",
|
||||
@ -31334,6 +31335,7 @@
|
||||
"LocalizedName": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Map Note",
|
||||
"id": 14814
|
||||
}
|
||||
},
|
||||
@ -31350,7 +31352,7 @@
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "NW_MAPNOTE001"
|
||||
"value": "NW_MAP_CELLAR"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
@ -31358,23 +31360,23 @@
|
||||
},
|
||||
"XOrientation": {
|
||||
"type": "float",
|
||||
"value": -0.9972904920578003
|
||||
"value": -1.0
|
||||
},
|
||||
"XPosition": {
|
||||
"type": "float",
|
||||
"value": 54.86586380004883
|
||||
"value": 55.38000106811523
|
||||
},
|
||||
"YOrientation": {
|
||||
"type": "float",
|
||||
"value": -0.07356434315443039
|
||||
"value": 7.549790126404332e-008
|
||||
},
|
||||
"YPosition": {
|
||||
"type": "float",
|
||||
"value": 79.65332794189453
|
||||
"value": 78.87999725341797
|
||||
},
|
||||
"ZPosition": {
|
||||
"type": "float",
|
||||
"value": -5.7220458984375e-006
|
||||
"value": 0.009999999776482582
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -1201,7 +1201,7 @@
|
||||
"Mod_Description": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Paths of Ascension [PRC8-CEP3]\n\nThis is the revised edition of the classic Paths of Ascension module, which is highly customized & more player friendly. This module has loads of customizing options right at your fingertips, color text, chat commands / emotes / appearances / 2 forges, if it can be created it's IN THERE!\n\nPRC'd By: Jaysyn\n\nSpell & Ability expansion by: rafhot\n\n(Requires PRC8 4.1.11+)"
|
||||
"0": "Paths of Ascension [PRC8-CEP3]\n\nThis is the revised edition of the classic Paths of Ascension module, which is highly customized & more player friendly. This module has loads of customizing options right at your fingertips, color text, chat commands / emotes / appearances / 2 forges, if it can be created it's IN THERE!\n\nPRC'd By: Jaysyn\n\nSpell & Ability expansion by: rafhot\n\n(Requires PRC8 4.61+)"
|
||||
}
|
||||
},
|
||||
"Mod_DuskHour": {
|
||||
|
@ -3477,6 +3477,25 @@
|
||||
"type": "resref",
|
||||
"value": "hobgoblin002"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 0.3333333432674408
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Hostile"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Hobgoblin Thrall"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_wrsl_war"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
@ -4005,6 +4024,25 @@
|
||||
"value": "prc_algoid"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 8.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Defender"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Animated Tree"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_anim_tree01"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -32892,6 +32930,44 @@
|
||||
"value": 90419
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 12.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Aranea"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_aranea001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 1.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Badger"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_badger001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -32930,6 +33006,82 @@
|
||||
"value": 12735
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 3.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Black Bear"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_blkbear001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 3.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Boar"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_boar001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 6.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Brown Bear"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_brnbear001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 10.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Bulette"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_bueltte001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -32949,6 +33101,25 @@
|
||||
"value": 12740
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 3.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Cooshee"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_cooshee001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -33025,6 +33196,25 @@
|
||||
"value": 12737
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 1.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Dire Rat"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_direrat001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -33082,6 +33272,25 @@
|
||||
"value": 12779
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 1.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Dog"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_dog001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -33405,6 +33614,25 @@
|
||||
"value": "s_ghoulravager"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 8.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Gorgon"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_gorgon001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -33709,6 +33937,25 @@
|
||||
"value": 12766
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 1.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Hawk"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_hawk001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -33804,6 +34051,25 @@
|
||||
"value": 12747
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 5.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Huge Viper"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_hgviper001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -33842,6 +34108,44 @@
|
||||
"value": 12752
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 8.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Invisible Stalker"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_invstlk001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 8.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Janni"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_janni001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -33899,6 +34203,25 @@
|
||||
"value": "prc_s_firelarge"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 3.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Large Viper"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_lgviper001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -33918,6 +34241,25 @@
|
||||
"value": "prc_s_waterlarge"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 3.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Leopard"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_leopard001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -33994,6 +34336,44 @@
|
||||
"value": 90417
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 5.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Lion"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_lion001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 9.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Manticore"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_mntcore001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -34051,6 +34431,63 @@
|
||||
"value": 90421
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 10.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Nymph"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_nymph001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 10.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Pixie"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_pixie001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 8.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Polar Bear"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_plrbear001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -34108,6 +34545,25 @@
|
||||
"value": 12767
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 5.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Satyr"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_satyr001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -34317,6 +34773,25 @@
|
||||
"value": 12764
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 1.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Small Viper"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_smviper001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -34412,6 +34887,25 @@
|
||||
"value": 12770
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 1.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Tiny Viper"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_tnviper001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -34564,6 +35058,25 @@
|
||||
"value": 40645
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 6.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Wereboar"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_wrboar001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
@ -34583,6 +35096,25 @@
|
||||
"value": 12778
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
"type": "float",
|
||||
"value": 2.0
|
||||
},
|
||||
"FACTION": {
|
||||
"type": "cexostring",
|
||||
"value": "Commoner"
|
||||
},
|
||||
"NAME": {
|
||||
"type": "cexostring",
|
||||
"value": "Summoned Wolf"
|
||||
},
|
||||
"RESREF": {
|
||||
"type": "resref",
|
||||
"value": "prc_s_wolf001"
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"CR": {
|
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
_module/ncs/creature_copy.ncs
Normal file
BIN
_module/ncs/creature_copy.ncs
Normal file
Binary file not shown.
BIN
_module/ncs/jy_itnk_amf1.ncs
Normal file
BIN
_module/ncs/jy_itnk_amf1.ncs
Normal file
Binary file not shown.
BIN
_module/ncs/jy_itnk_amf2.ncs
Normal file
BIN
_module/ncs/jy_itnk_amf2.ncs
Normal file
Binary file not shown.
BIN
_module/ncs/jy_itnk_amf3.ncs
Normal file
BIN
_module/ncs/jy_itnk_amf3.ncs
Normal file
Binary file not shown.
BIN
_module/ncs/jy_itnk_amf4.ncs
Normal file
BIN
_module/ncs/jy_itnk_amf4.ncs
Normal file
Binary file not shown.
BIN
_module/ncs/jy_itnk_amf5.ncs
Normal file
BIN
_module/ncs/jy_itnk_amf5.ncs
Normal file
Binary file not shown.
Binary file not shown.
BIN
_module/ncs/make_greenbound.ncs
Normal file
BIN
_module/ncs/make_greenbound.ncs
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
216
_module/nss/creature_copy.nss
Normal file
216
_module/nss/creature_copy.nss
Normal file
@ -0,0 +1,216 @@
|
||||
#include "nw_inc_gff"
|
||||
#include "npc_template_inc"
|
||||
#include "prc_inc_spells"
|
||||
#include "prc_inc_util"
|
||||
#include "prc_inc_json"
|
||||
|
||||
//:: Adds Evolved SLA's to jCreature.
|
||||
//::
|
||||
json json_AddEvolvedPowers(json jCreature, int nBaseHD, int nCasterLevel, int iEvolution)
|
||||
{
|
||||
int nAttempts = 0;
|
||||
json jSpecAbilityList = GffGetList(jCreature, "SpecAbilityList");
|
||||
if (jSpecAbilityList == JsonNull()) jSpecAbilityList = JsonArray();
|
||||
|
||||
while (nAttempts < 20) // safety cap
|
||||
{
|
||||
nAttempts++;
|
||||
int nRandom = d12(1);
|
||||
json jSpecAbility = JsonObject();
|
||||
|
||||
switch(nRandom)
|
||||
{
|
||||
case 1:
|
||||
if (nBaseHD < 6) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 18);
|
||||
break;
|
||||
case 2:
|
||||
if (nBaseHD < 5) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 23);
|
||||
break;
|
||||
case 3:
|
||||
if (nBaseHD < 4) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 25);
|
||||
break;
|
||||
case 4:
|
||||
if (nBaseHD < 3) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 26);
|
||||
break;
|
||||
case 5:
|
||||
if (nBaseHD < 3) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 27);
|
||||
break;
|
||||
case 6:
|
||||
if (nBaseHD < 7) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 364);
|
||||
break;
|
||||
case 7:
|
||||
if (nBaseHD < 5) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 67);
|
||||
break;
|
||||
case 8:
|
||||
if (nBaseHD < 4) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 88);
|
||||
break;
|
||||
case 9:
|
||||
if (nBaseHD < 3) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 78);
|
||||
break;
|
||||
case 10:
|
||||
if (nBaseHD < 4) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 82);
|
||||
break;
|
||||
case 11:
|
||||
if (nBaseHD < 2) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 157);
|
||||
break;
|
||||
case 12:
|
||||
if (nBaseHD < 5) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 566);
|
||||
break;
|
||||
default:
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 46); // Doom fallback
|
||||
break;
|
||||
}
|
||||
|
||||
// If jSpecAbility still empty for some reason, retry
|
||||
if (JsonGetType(jSpecAbility) != JSON_TYPE_OBJECT) continue;
|
||||
|
||||
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD));
|
||||
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
|
||||
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
|
||||
break;
|
||||
}
|
||||
|
||||
return GffAddList(jCreature, "SpecAbilityList", jSpecAbilityList);
|
||||
}
|
||||
|
||||
//:: Apply Evolved effects to a non-PC creature
|
||||
void ApplyEvolvedEffects(object oCreature, int nBaseHD, int nCasterLevel, int iEvolution)
|
||||
{
|
||||
//:: Declare major variables
|
||||
int bIncorporeal = GetIsIncorporeal(oCreature);
|
||||
effect eVolved;
|
||||
|
||||
//:: Boost caster & SLA level
|
||||
SetLocalInt(oCreature, PRC_CASTERLEVEL_ADJUSTMENT, PRCMax(nCasterLevel, nBaseHD));
|
||||
|
||||
//:: AC Bonuses: +1 natural or +1 deflection if Incorporal
|
||||
if(bIncorporeal)
|
||||
{
|
||||
eVolved = EffectACIncrease(1+iEvolution, AC_DEFLECTION_BONUS);
|
||||
}
|
||||
else
|
||||
{
|
||||
eVolved = EffectACIncrease(1+iEvolution, AC_NATURAL_BONUS);
|
||||
}
|
||||
|
||||
//:: Fast Healing 3
|
||||
eVolved = EffectLinkEffects(eVolved, EffectRegenerate(3, 6.0f));
|
||||
|
||||
//:: Make *really* permanent
|
||||
eVolved = UnyieldingEffect(eVolved);
|
||||
|
||||
//:: Apply everything
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eVolved, oCreature);
|
||||
}
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
//:: Declare major variables
|
||||
object oBaseCreature = OBJECT_SELF;
|
||||
object oNewCreature;
|
||||
|
||||
GetObjectUUID(oBaseCreature);
|
||||
|
||||
int bIncorporeal = GetIsIncorporeal(oBaseCreature);
|
||||
int iBaseRace = MyPRCGetRacialType(oBaseCreature);
|
||||
int nCasterLevel = PRCGetCasterLevel(oBaseCreature);
|
||||
|
||||
int iEvolution = 1;
|
||||
int iOldEvolution = GetLocalInt(oBaseCreature, "UNDEAD_EVOLUTION");
|
||||
|
||||
//:: Creatures & NPCs only
|
||||
if ((GetObjectType(oBaseCreature) != OBJECT_TYPE_CREATURE) || (GetIsPC(oBaseCreature) == TRUE))
|
||||
{
|
||||
DoDebug("Not a creature");
|
||||
return;
|
||||
}
|
||||
|
||||
//:: Undead only
|
||||
if(iBaseRace != RACIAL_TYPE_UNDEAD)
|
||||
{
|
||||
//SendMessageToPC(GetFirstPC(), "make_evolved: Invalid racial type for template.");
|
||||
DoDebug("make_evolved: Invalid racial type for template.");
|
||||
return;
|
||||
}
|
||||
|
||||
/* if(DEBUG) */DoDebug("make_evolved: Previous Evolution is: " +IntToString(iOldEvolution));
|
||||
|
||||
iEvolution = iEvolution + iOldEvolution;
|
||||
|
||||
/* if(DEBUG) */DoDebug("make_evolved: Evolution is: " +IntToString(iEvolution));
|
||||
|
||||
int nBaseHD = GetHitDice(oBaseCreature);
|
||||
int nBaseCR = FloatToInt(GetChallengeRating(oBaseCreature));
|
||||
|
||||
location lSpawnLoc = GetLocation(oBaseCreature);
|
||||
|
||||
json jBaseCreature = ObjectToJson(oBaseCreature, FALSE);
|
||||
json jNewCreature;
|
||||
json jFinalCreature;
|
||||
|
||||
//:: Update creature's name on first advancement
|
||||
string sBaseName = GetName(oBaseCreature);
|
||||
|
||||
//:: Add Spell-like abilities
|
||||
jNewCreature = json_AddEvolvedPowers(jBaseCreature, nBaseHD, nCasterLevel, iEvolution);
|
||||
|
||||
//:: Update stats
|
||||
if(bIncorporeal)
|
||||
{
|
||||
//:: Incorporeal = CHA only
|
||||
jNewCreature = json_UpdateCreatureStats(jNewCreature, oBaseCreature, 0, 0, 0, 0, 0, 2);
|
||||
}
|
||||
else
|
||||
{
|
||||
jNewCreature = json_UpdateCreatureStats(jNewCreature, oBaseCreature, 2, 0, 0, 0, 0, 2);
|
||||
}
|
||||
|
||||
//:: Apply effects
|
||||
ApplyEvolvedEffects(oNewCreature, nBaseHD, nCasterLevel, iEvolution);
|
||||
|
||||
|
||||
jFinalCreature = jNewCreature;
|
||||
|
||||
//:: Destroy Original creature
|
||||
DestroyObject(oBaseCreature, 0.0f);
|
||||
|
||||
//:: Update the creature
|
||||
oNewCreature = JsonToObject(jFinalCreature, lSpawnLoc);
|
||||
|
||||
if(DEBUG) DoDebug("make_evolved: Final evolution is: " +IntToString(iEvolution));
|
||||
if (iEvolution == 1)
|
||||
{
|
||||
SetName(oNewCreature, "Evolved " + sBaseName);
|
||||
}
|
||||
else if (iEvolution == 2)
|
||||
{
|
||||
SetName(oNewCreature, "Greater " + sBaseName);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetName(oNewCreature, sBaseName);
|
||||
}
|
||||
|
||||
//:: Update race field
|
||||
SetSubRace(oNewCreature, "Undead (Augmented)");
|
||||
|
||||
//:: Update Age
|
||||
SetAge(oNewCreature, GetAge(oNewCreature) + d100(1));
|
||||
|
||||
//:: Set variables
|
||||
SetLocalInt(oNewCreature, "UNDEAD_EVOLUTION", iEvolution);
|
||||
SetLocalInt(oNewCreature, "TEMPLATE_EVOLVED", 1);
|
||||
}
|
10
_module/nss/inc_greenbound.nss
Normal file
10
_module/nss/inc_greenbound.nss
Normal file
@ -0,0 +1,10 @@
|
||||
/* Paragon Creature Template
|
||||
|
||||
By: Jaysyn
|
||||
Created: 2024-11-14 08:27:30
|
||||
|
||||
A greenbound creature looks much like it did before transformation, although certain changes are apparent. The creature's flesh has been replaced by pulpy wood and thickly corded creepers, and tiny branches stick out from its torso, arms, and legs. Any feathers, hair, or fur it once had have been replaced by some combination of green vines, moss, flowers, and leaves.
|
||||
|
||||
Greenbound creatures speak any languages they knew before transformation, although their voices are now deep and gravelly.
|
||||
|
||||
/*
|
173
_module/nss/jy_itnk_amf1.nss
Normal file
173
_module/nss/jy_itnk_amf1.nss
Normal file
@ -0,0 +1,173 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Amulet of Mighty Fists +1
|
||||
//:: jy_itnk_amf1
|
||||
//::
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Amulet of Mighty Fists +1
|
||||
Magic Item
|
||||
(Dungeon Master's Guide v.3.5, p. 246)
|
||||
|
||||
Price: 6,000 gp
|
||||
Body Slot: Throat
|
||||
Caster Level: 5th
|
||||
Aura: Faint; (DC 18) Evocation
|
||||
Activation: —
|
||||
Weight: — lb.
|
||||
|
||||
This amulet grants an enhancement bonus of +1 on attack
|
||||
and damage rolls with unarmed attacks and natural weapons.
|
||||
|
||||
Prerequisites: Craft Wondrous Item , Magic Fang, Greater
|
||||
creator's caster level must be at least 3x the amulet's bonus.
|
||||
|
||||
Cost to Create: 3,000 gp, 240 XP, 6 day(s).
|
||||
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Modified By: Jaysyn
|
||||
//:: Modified On: 2025-05-25 20:23:47
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "x2_inc_switches"
|
||||
#include "inc_eventhook"
|
||||
#include "prc_inc_combat"
|
||||
|
||||
const string AMULET_RES = "jy_itnk_amf1";
|
||||
const string AMULET_EFFECT = "AMULET_MIGHTY_FISTS+1";
|
||||
const string SCRIPT_NAME = "jy_itnk_amf1";
|
||||
|
||||
// check if PC is wearing the amulet
|
||||
int WearingAmulet(object oPC)
|
||||
{
|
||||
object oNeck = GetItemInSlot(INVENTORY_SLOT_NECK, oPC);
|
||||
return (GetIsObjectValid(oNeck) &&
|
||||
(GetResRef(oNeck) == AMULET_RES || GetTag(oNeck) == AMULET_RES));
|
||||
}
|
||||
|
||||
// remove any lingering effect
|
||||
void RemoveAmuletEffect(object oPC)
|
||||
{
|
||||
effect e = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(e))
|
||||
{
|
||||
if (GetEffectTag(e) == AMULET_EFFECT)
|
||||
RemoveEffect(oPC, e);
|
||||
e = GetNextEffect(oPC);
|
||||
}
|
||||
}
|
||||
|
||||
// apply new effect
|
||||
void ApplyAmuletEffect(object oPC)
|
||||
{
|
||||
RemoveAmuletEffect(oPC);
|
||||
|
||||
effect eMightyR = EffectAttackIncrease(1, ATTACK_BONUS_ONHAND);
|
||||
effect eMightyL = EffectAttackIncrease(1, ATTACK_BONUS_OFFHAND);
|
||||
effect eDmg = EffectDamageIncrease(DAMAGE_BONUS_1, DAMAGE_TYPE_MAGICAL);
|
||||
|
||||
effect eLink = EffectLinkEffects(EffectLinkEffects(eMightyR, eMightyL), eDmg);
|
||||
eLink = TagEffect(eLink, AMULET_EFFECT);
|
||||
eLink = ExtraordinaryEffect(eLink);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_GOOD_HELP), oPC);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
int nEvent = GetUserDefinedItemEventNumber();
|
||||
object oPC;
|
||||
object oItem;
|
||||
|
||||
// Debug message
|
||||
if(DEBUG) DoDebug("jy_itnk_amf1 >> Event: " + IntToString(nEvent));
|
||||
|
||||
switch (nEvent)
|
||||
{
|
||||
// Item equipped (any item)
|
||||
case X2_ITEM_EVENT_EQUIP:
|
||||
oPC = GetPCItemLastEquippedBy();
|
||||
oItem = GetPCItemLastEquipped();
|
||||
|
||||
if(DEBUG) DoDebug("jy_itnk_amf1 >> Equipped: " + GetName(oItem));
|
||||
|
||||
// If this is our amulet being equipped
|
||||
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
|
||||
{
|
||||
// Register for equipment change events
|
||||
AddEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
|
||||
// Apply effect if unarmed
|
||||
if (GetIsUnarmed(oPC))
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
// If a weapon is equipped while wearing the amulet, remove the effect
|
||||
else if (WearingAmulet(oPC) && !GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf1 >> Removing effect due to weapon equip");
|
||||
RemoveAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
// Item unequipped (any item)
|
||||
case X2_ITEM_EVENT_UNEQUIP:
|
||||
oPC = GetPCItemLastUnequippedBy();
|
||||
oItem = GetPCItemLastUnequipped();
|
||||
|
||||
if(DEBUG) DoDebug("jy_itnk_amf1 >> Unequipped: " + GetName(oItem));
|
||||
|
||||
// If this is our amulet being unequipped
|
||||
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
|
||||
{
|
||||
// Remove effect immediately when amulet is unequipped
|
||||
RemoveAmuletEffect(oPC);
|
||||
|
||||
// Unregister events
|
||||
RemoveEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
RemoveEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
}
|
||||
// If a weapon is unequipped while wearing the amulet, and PC is now unarmed,
|
||||
// apply the effect
|
||||
else if (WearingAmulet(oPC) && GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf1 >> Adding effect due to weapon unequip");
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
// Handle PRC eventhooks
|
||||
case EVENT_ONPLAYEREQUIPITEM:
|
||||
oPC = GetPCItemLastEquippedBy();
|
||||
oItem = GetPCItemLastEquipped();
|
||||
|
||||
// If not wearing the amulet, do nothing
|
||||
if (!WearingAmulet(oPC))
|
||||
return;
|
||||
|
||||
// If a weapon was equipped, remove the amulet effect
|
||||
if (!GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf1 >> PRC Eventhook: Removing effect due to weapon equip");
|
||||
RemoveAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
case EVENT_ONPLAYERUNEQUIPITEM:
|
||||
oPC = GetPCItemLastUnequippedBy();
|
||||
oItem = GetPCItemLastUnequipped();
|
||||
|
||||
// If not wearing the amulet, do nothing
|
||||
if (!WearingAmulet(oPC))
|
||||
return;
|
||||
|
||||
// If they're now unarmed after unequipping something, apply the effect
|
||||
if (GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf1 >> PRC Eventhook: Adding effect due to weapon unequip");
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
175
_module/nss/jy_itnk_amf2.nss
Normal file
175
_module/nss/jy_itnk_amf2.nss
Normal file
@ -0,0 +1,175 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Amulet of Mighty Fists +2
|
||||
//:: jy_itnk_amf2
|
||||
//::
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Amulet of Might Fists +2
|
||||
Magic Item
|
||||
(Dungeon Master's Guide v.3.5, p. 246)
|
||||
|
||||
Price: 24,000 gp
|
||||
Body Slot: Throat
|
||||
Caster Level: 5th
|
||||
Aura: Faint; (DC 18) Evocation
|
||||
Activation: —
|
||||
Weight: — lb.
|
||||
|
||||
This amulet grants an enhancement bonus of +2
|
||||
on attack and damage rolls with unarmed attacks
|
||||
and natural weapons.
|
||||
|
||||
Prerequisites: Craft Wondrous Item , Magic Fang,
|
||||
Greater creator’s caster level must be at least
|
||||
3x the amulet’s bonus.
|
||||
|
||||
Cost to Create: 12,000 gp, 960 XP, 24 day(s).
|
||||
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Modified By: Jaysyn
|
||||
//:: Modified On: 2025-09-03 20:57:04
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "x2_inc_switches"
|
||||
#include "inc_eventhook"
|
||||
#include "prc_inc_combat"
|
||||
|
||||
const string AMULET_RES = "jy_itnk_amf2";
|
||||
const string AMULET_EFFECT = "AMULET_MIGHTY_FISTS+2";
|
||||
const string SCRIPT_NAME = "jy_itnk_amf2";
|
||||
|
||||
// check if PC is wearing the amulet
|
||||
int WearingAmulet(object oPC)
|
||||
{
|
||||
object oNeck = GetItemInSlot(INVENTORY_SLOT_NECK, oPC);
|
||||
return (GetIsObjectValid(oNeck) &&
|
||||
(GetResRef(oNeck) == AMULET_RES || GetTag(oNeck) == AMULET_RES));
|
||||
}
|
||||
|
||||
// remove any lingering effect
|
||||
void RemoveAmuletEffect(object oPC)
|
||||
{
|
||||
effect e = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(e))
|
||||
{
|
||||
if (GetEffectTag(e) == AMULET_EFFECT)
|
||||
RemoveEffect(oPC, e);
|
||||
e = GetNextEffect(oPC);
|
||||
}
|
||||
}
|
||||
|
||||
// apply new effect
|
||||
void ApplyAmuletEffect(object oPC)
|
||||
{
|
||||
RemoveAmuletEffect(oPC);
|
||||
|
||||
effect eMightyR = EffectAttackIncrease(2, ATTACK_BONUS_ONHAND);
|
||||
effect eMightyL = EffectAttackIncrease(2, ATTACK_BONUS_OFFHAND);
|
||||
effect eDmg = EffectDamageIncrease(DAMAGE_BONUS_2, DAMAGE_TYPE_MAGICAL);
|
||||
|
||||
effect eLink = EffectLinkEffects(EffectLinkEffects(eMightyR, eMightyL), eDmg);
|
||||
eLink = TagEffect(eLink, AMULET_EFFECT);
|
||||
eLink = ExtraordinaryEffect(eLink);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_GOOD_HELP), oPC);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
int nEvent = GetUserDefinedItemEventNumber();
|
||||
object oPC;
|
||||
object oItem;
|
||||
|
||||
// Debug message
|
||||
if(DEBUG) DoDebug("jy_itnk_amf2 >> Event: " + IntToString(nEvent));
|
||||
|
||||
switch (nEvent)
|
||||
{
|
||||
// Item equipped (any item)
|
||||
case X2_ITEM_EVENT_EQUIP:
|
||||
oPC = GetPCItemLastEquippedBy();
|
||||
oItem = GetPCItemLastEquipped();
|
||||
|
||||
if(DEBUG) DoDebug("jy_itnk_amf2 >> Equipped: " + GetName(oItem));
|
||||
|
||||
// If this is our amulet being equipped
|
||||
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
|
||||
{
|
||||
// Register for equipment change events
|
||||
AddEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
|
||||
// Apply effect if unarmed
|
||||
if (GetIsUnarmed(oPC))
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
// If a weapon is equipped while wearing the amulet, remove the effect
|
||||
else if (WearingAmulet(oPC) && !GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf2 >> Removing effect due to weapon equip");
|
||||
RemoveAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
// Item unequipped (any item)
|
||||
case X2_ITEM_EVENT_UNEQUIP:
|
||||
oPC = GetPCItemLastUnequippedBy();
|
||||
oItem = GetPCItemLastUnequipped();
|
||||
|
||||
if(DEBUG) DoDebug("jy_itnk_amf2 >> Unequipped: " + GetName(oItem));
|
||||
|
||||
// If this is our amulet being unequipped
|
||||
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
|
||||
{
|
||||
// Remove effect immediately when amulet is unequipped
|
||||
RemoveAmuletEffect(oPC);
|
||||
|
||||
// Unregister events
|
||||
RemoveEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
RemoveEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
}
|
||||
// If a weapon is unequipped while wearing the amulet, and PC is now unarmed,
|
||||
// apply the effect
|
||||
else if (WearingAmulet(oPC) && GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf2 >> Adding effect due to weapon unequip");
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
// Handle PRC eventhooks
|
||||
case EVENT_ONPLAYEREQUIPITEM:
|
||||
oPC = GetPCItemLastEquippedBy();
|
||||
oItem = GetPCItemLastEquipped();
|
||||
|
||||
// If not wearing the amulet, do nothing
|
||||
if (!WearingAmulet(oPC))
|
||||
return;
|
||||
|
||||
// If a weapon was equipped, remove the amulet effect
|
||||
if (!GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf2 >> PRC Eventhook: Removing effect due to weapon equip");
|
||||
RemoveAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
case EVENT_ONPLAYERUNEQUIPITEM:
|
||||
oPC = GetPCItemLastUnequippedBy();
|
||||
oItem = GetPCItemLastUnequipped();
|
||||
|
||||
// If not wearing the amulet, do nothing
|
||||
if (!WearingAmulet(oPC))
|
||||
return;
|
||||
|
||||
// If they're now unarmed after unequipping something, apply the effect
|
||||
if (GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf2 >> PRC Eventhook: Adding effect due to weapon unequip");
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
175
_module/nss/jy_itnk_amf3.nss
Normal file
175
_module/nss/jy_itnk_amf3.nss
Normal file
@ -0,0 +1,175 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Amulet of Mighty Fists +3
|
||||
//:: jy_itnk_amf3
|
||||
//::
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Amulet of Might Fists +3
|
||||
Magic Item
|
||||
(Dungeon Master's Guide v.3.5, p. 246)
|
||||
|
||||
Price: 54,000 gp
|
||||
Body Slot: Throat
|
||||
Caster Level: 5th
|
||||
Aura: Faint; (DC 18) Evocation
|
||||
Activation: —
|
||||
Weight: — lb.
|
||||
|
||||
This amulet grants an enhancement bonus of +3
|
||||
on attack and damage rolls with unarmed attacks
|
||||
and natural weapons.
|
||||
|
||||
Prerequisites: Craft Wondrous Item , Magic Fang,
|
||||
Greater creator’s caster level must be at least
|
||||
3x the amulet’s bonus.
|
||||
|
||||
Cost to Create: 27,000 gp, 2,160 XP, 54 day(s).
|
||||
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Modified By: Jaysyn
|
||||
//:: Modified On: 2025-05-25 20:23:47
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "x2_inc_switches"
|
||||
#include "inc_eventhook"
|
||||
#include "prc_inc_combat"
|
||||
|
||||
const string AMULET_RES = "jy_itnk_amf3";
|
||||
const string AMULET_EFFECT = "AMULET_MIGHTY_FISTS+3";
|
||||
const string SCRIPT_NAME = "jy_itnk_amf3";
|
||||
|
||||
// check if PC is wearing the amulet
|
||||
int WearingAmulet(object oPC)
|
||||
{
|
||||
object oNeck = GetItemInSlot(INVENTORY_SLOT_NECK, oPC);
|
||||
return (GetIsObjectValid(oNeck) &&
|
||||
(GetResRef(oNeck) == AMULET_RES || GetTag(oNeck) == AMULET_RES));
|
||||
}
|
||||
|
||||
// remove any lingering effect
|
||||
void RemoveAmuletEffect(object oPC)
|
||||
{
|
||||
effect e = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(e))
|
||||
{
|
||||
if (GetEffectTag(e) == AMULET_EFFECT)
|
||||
RemoveEffect(oPC, e);
|
||||
e = GetNextEffect(oPC);
|
||||
}
|
||||
}
|
||||
|
||||
// apply new effect
|
||||
void ApplyAmuletEffect(object oPC)
|
||||
{
|
||||
RemoveAmuletEffect(oPC);
|
||||
|
||||
effect eMightyR = EffectAttackIncrease(3, ATTACK_BONUS_ONHAND);
|
||||
effect eMightyL = EffectAttackIncrease(3, ATTACK_BONUS_OFFHAND);
|
||||
effect eDmg = EffectDamageIncrease(DAMAGE_BONUS_3, DAMAGE_TYPE_MAGICAL);
|
||||
|
||||
effect eLink = EffectLinkEffects(EffectLinkEffects(eMightyR, eMightyL), eDmg);
|
||||
eLink = TagEffect(eLink, AMULET_EFFECT);
|
||||
eLink = ExtraordinaryEffect(eLink);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_GOOD_HELP), oPC);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
int nEvent = GetUserDefinedItemEventNumber();
|
||||
object oPC;
|
||||
object oItem;
|
||||
|
||||
// Debug message
|
||||
if(DEBUG) DoDebug("jy_itnk_amf3 >> Event: " + IntToString(nEvent));
|
||||
|
||||
switch (nEvent)
|
||||
{
|
||||
// Item equipped (any item)
|
||||
case X2_ITEM_EVENT_EQUIP:
|
||||
oPC = GetPCItemLastEquippedBy();
|
||||
oItem = GetPCItemLastEquipped();
|
||||
|
||||
if(DEBUG) DoDebug("jy_itnk_amf3 >> Equipped: " + GetName(oItem));
|
||||
|
||||
// If this is our amulet being equipped
|
||||
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
|
||||
{
|
||||
// Register for equipment change events
|
||||
AddEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
|
||||
// Apply effect if unarmed
|
||||
if (GetIsUnarmed(oPC))
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
// If a weapon is equipped while wearing the amulet, remove the effect
|
||||
else if (WearingAmulet(oPC) && !GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf3 >> Removing effect due to weapon equip");
|
||||
RemoveAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
// Item unequipped (any item)
|
||||
case X2_ITEM_EVENT_UNEQUIP:
|
||||
oPC = GetPCItemLastUnequippedBy();
|
||||
oItem = GetPCItemLastUnequipped();
|
||||
|
||||
if(DEBUG) DoDebug("jy_itnk_amf3 >> Unequipped: " + GetName(oItem));
|
||||
|
||||
// If this is our amulet being unequipped
|
||||
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
|
||||
{
|
||||
// Remove effect immediately when amulet is unequipped
|
||||
RemoveAmuletEffect(oPC);
|
||||
|
||||
// Unregister events
|
||||
RemoveEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
RemoveEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
}
|
||||
// If a weapon is unequipped while wearing the amulet, and PC is now unarmed,
|
||||
// apply the effect
|
||||
else if (WearingAmulet(oPC) && GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf3 >> Adding effect due to weapon unequip");
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
// Handle PRC eventhooks
|
||||
case EVENT_ONPLAYEREQUIPITEM:
|
||||
oPC = GetPCItemLastEquippedBy();
|
||||
oItem = GetPCItemLastEquipped();
|
||||
|
||||
// If not wearing the amulet, do nothing
|
||||
if (!WearingAmulet(oPC))
|
||||
return;
|
||||
|
||||
// If a weapon was equipped, remove the amulet effect
|
||||
if (!GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf3 >> PRC Eventhook: Removing effect due to weapon equip");
|
||||
RemoveAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
case EVENT_ONPLAYERUNEQUIPITEM:
|
||||
oPC = GetPCItemLastUnequippedBy();
|
||||
oItem = GetPCItemLastUnequipped();
|
||||
|
||||
// If not wearing the amulet, do nothing
|
||||
if (!WearingAmulet(oPC))
|
||||
return;
|
||||
|
||||
// If they're now unarmed after unequipping something, apply the effect
|
||||
if (GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf3 >> PRC Eventhook: Adding effect due to weapon unequip");
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
174
_module/nss/jy_itnk_amf4.nss
Normal file
174
_module/nss/jy_itnk_amf4.nss
Normal file
@ -0,0 +1,174 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Amulet of Mighty Fists +4
|
||||
//:: jy_itnk_amf4
|
||||
//::
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Amulet of Might Fists +4
|
||||
Magic Item
|
||||
(Dungeon Master's Guide v.3.5, p. 246)
|
||||
|
||||
Price: 96,000 gp
|
||||
Body Slot: Throat
|
||||
Caster Level: 5th
|
||||
Aura: Faint; (DC 18)
|
||||
Activation: —
|
||||
Weight: — lb.
|
||||
|
||||
This amulet grants an enhancement bonus of +4
|
||||
on attack and damage rolls with unarmed attacks
|
||||
and natural weapons.
|
||||
|
||||
Prerequisites: creator’s caster level must be at
|
||||
least 3x the amulet’s bonus.
|
||||
|
||||
Cost to Create: 48,000 gp, 3,840 XP, 96 day(s).
|
||||
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Modified By: Jaysyn
|
||||
//:: Modified On: 2025-05-25 20:23:47
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "x2_inc_switches"
|
||||
#include "inc_eventhook"
|
||||
#include "prc_inc_combat"
|
||||
|
||||
const string AMULET_RES = "jy_itnk_amf4";
|
||||
const string AMULET_EFFECT = "AMULET_MIGHTY_FISTS+4";
|
||||
const string SCRIPT_NAME = "jy_itnk_amf4";
|
||||
|
||||
// check if PC is wearing the amulet
|
||||
int WearingAmulet(object oPC)
|
||||
{
|
||||
object oNeck = GetItemInSlot(INVENTORY_SLOT_NECK, oPC);
|
||||
return (GetIsObjectValid(oNeck) &&
|
||||
(GetResRef(oNeck) == AMULET_RES || GetTag(oNeck) == AMULET_RES));
|
||||
}
|
||||
|
||||
// remove any lingering effect
|
||||
void RemoveAmuletEffect(object oPC)
|
||||
{
|
||||
effect e = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(e))
|
||||
{
|
||||
if (GetEffectTag(e) == AMULET_EFFECT)
|
||||
RemoveEffect(oPC, e);
|
||||
e = GetNextEffect(oPC);
|
||||
}
|
||||
}
|
||||
|
||||
// apply new effect
|
||||
void ApplyAmuletEffect(object oPC)
|
||||
{
|
||||
RemoveAmuletEffect(oPC);
|
||||
|
||||
effect eMightyR = EffectAttackIncrease(4, ATTACK_BONUS_ONHAND);
|
||||
effect eMightyL = EffectAttackIncrease(4, ATTACK_BONUS_OFFHAND);
|
||||
effect eDmg = EffectDamageIncrease(DAMAGE_BONUS_4, DAMAGE_TYPE_MAGICAL);
|
||||
|
||||
effect eLink = EffectLinkEffects(EffectLinkEffects(eMightyR, eMightyL), eDmg);
|
||||
eLink = TagEffect(eLink, AMULET_EFFECT);
|
||||
eLink = ExtraordinaryEffect(eLink);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_GOOD_HELP), oPC);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
int nEvent = GetUserDefinedItemEventNumber();
|
||||
object oPC;
|
||||
object oItem;
|
||||
|
||||
// Debug message
|
||||
if(DEBUG) DoDebug("jy_itnk_amf4 >> Event: " + IntToString(nEvent));
|
||||
|
||||
switch (nEvent)
|
||||
{
|
||||
// Item equipped (any item)
|
||||
case X2_ITEM_EVENT_EQUIP:
|
||||
oPC = GetPCItemLastEquippedBy();
|
||||
oItem = GetPCItemLastEquipped();
|
||||
|
||||
if(DEBUG) DoDebug("jy_itnk_amf4 >> Equipped: " + GetName(oItem));
|
||||
|
||||
// If this is our amulet being equipped
|
||||
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
|
||||
{
|
||||
// Register for equipment change events
|
||||
AddEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
|
||||
// Apply effect if unarmed
|
||||
if (GetIsUnarmed(oPC))
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
// If a weapon is equipped while wearing the amulet, remove the effect
|
||||
else if (WearingAmulet(oPC) && !GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf4 >> Removing effect due to weapon equip");
|
||||
RemoveAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
// Item unequipped (any item)
|
||||
case X2_ITEM_EVENT_UNEQUIP:
|
||||
oPC = GetPCItemLastUnequippedBy();
|
||||
oItem = GetPCItemLastUnequipped();
|
||||
|
||||
if(DEBUG) DoDebug("jy_itnk_amf4 >> Unequipped: " + GetName(oItem));
|
||||
|
||||
// If this is our amulet being unequipped
|
||||
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
|
||||
{
|
||||
// Remove effect immediately when amulet is unequipped
|
||||
RemoveAmuletEffect(oPC);
|
||||
|
||||
// Unregister events
|
||||
RemoveEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
RemoveEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
}
|
||||
// If a weapon is unequipped while wearing the amulet, and PC is now unarmed,
|
||||
// apply the effect
|
||||
else if (WearingAmulet(oPC) && GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf4 >> Adding effect due to weapon unequip");
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
// Handle PRC eventhooks
|
||||
case EVENT_ONPLAYEREQUIPITEM:
|
||||
oPC = GetPCItemLastEquippedBy();
|
||||
oItem = GetPCItemLastEquipped();
|
||||
|
||||
// If not wearing the amulet, do nothing
|
||||
if (!WearingAmulet(oPC))
|
||||
return;
|
||||
|
||||
// If a weapon was equipped, remove the amulet effect
|
||||
if (!GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf4 >> PRC Eventhook: Removing effect due to weapon equip");
|
||||
RemoveAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
case EVENT_ONPLAYERUNEQUIPITEM:
|
||||
oPC = GetPCItemLastUnequippedBy();
|
||||
oItem = GetPCItemLastUnequipped();
|
||||
|
||||
// If not wearing the amulet, do nothing
|
||||
if (!WearingAmulet(oPC))
|
||||
return;
|
||||
|
||||
// If they're now unarmed after unequipping something, apply the effect
|
||||
if (GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf4 >> PRC Eventhook: Adding effect due to weapon unequip");
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
173
_module/nss/jy_itnk_amf5.nss
Normal file
173
_module/nss/jy_itnk_amf5.nss
Normal file
@ -0,0 +1,173 @@
|
||||
//::///////////////////////////////////////////////
|
||||
//:: Amulet of Mighty Fists +1
|
||||
//:: jy_itnk_amf5
|
||||
//::
|
||||
//:://////////////////////////////////////////////
|
||||
/*
|
||||
Amulet of Mighty Fists +1
|
||||
Magic Item
|
||||
(Dungeon Master's Guide v.3.5, p. 246)
|
||||
|
||||
Price: 6,000 gp
|
||||
Body Slot: Throat
|
||||
Caster Level: 5th
|
||||
Aura: Faint; (DC 18) Evocation
|
||||
Activation: —
|
||||
Weight: — lb.
|
||||
|
||||
This amulet grants an enhancement bonus of +1 on attack
|
||||
and damage rolls with unarmed attacks and natural weapons.
|
||||
|
||||
Prerequisites: Craft Wondrous Item , Magic Fang, Greater
|
||||
creator's caster level must be at least 3x the amulet's bonus.
|
||||
|
||||
Cost to Create: 3,000 gp, 240 XP, 6 day(s).
|
||||
|
||||
*/
|
||||
//:://////////////////////////////////////////////
|
||||
//:: Modified By: Jaysyn
|
||||
//:: Modified On: 2025-05-25 20:23:47
|
||||
//:://////////////////////////////////////////////
|
||||
|
||||
#include "x2_inc_switches"
|
||||
#include "inc_eventhook"
|
||||
#include "prc_inc_combat"
|
||||
|
||||
const string AMULET_RES = "jy_itnk_amf5";
|
||||
const string AMULET_EFFECT = "AMULET_MIGHTY_FISTS+5";
|
||||
const string SCRIPT_NAME = "jy_itnk_amf5";
|
||||
|
||||
// check if PC is wearing the amulet
|
||||
int WearingAmulet(object oPC)
|
||||
{
|
||||
object oNeck = GetItemInSlot(INVENTORY_SLOT_NECK, oPC);
|
||||
return (GetIsObjectValid(oNeck) &&
|
||||
(GetResRef(oNeck) == AMULET_RES || GetTag(oNeck) == AMULET_RES));
|
||||
}
|
||||
|
||||
// remove any lingering effect
|
||||
void RemoveAmuletEffect(object oPC)
|
||||
{
|
||||
effect e = GetFirstEffect(oPC);
|
||||
while (GetIsEffectValid(e))
|
||||
{
|
||||
if (GetEffectTag(e) == AMULET_EFFECT)
|
||||
RemoveEffect(oPC, e);
|
||||
e = GetNextEffect(oPC);
|
||||
}
|
||||
}
|
||||
|
||||
// apply new effect
|
||||
void ApplyAmuletEffect(object oPC)
|
||||
{
|
||||
RemoveAmuletEffect(oPC);
|
||||
|
||||
effect eMightyR = EffectAttackIncrease(5, ATTACK_BONUS_ONHAND);
|
||||
effect eMightyL = EffectAttackIncrease(5, ATTACK_BONUS_OFFHAND);
|
||||
effect eDmg = EffectDamageIncrease(DAMAGE_BONUS_5, DAMAGE_TYPE_MAGICAL);
|
||||
|
||||
effect eLink = EffectLinkEffects(EffectLinkEffects(eMightyR, eMightyL), eDmg);
|
||||
eLink = TagEffect(eLink, AMULET_EFFECT);
|
||||
eLink = ExtraordinaryEffect(eLink);
|
||||
|
||||
ApplyEffectToObject(DURATION_TYPE_INSTANT, EffectVisualEffect(VFX_IMP_GOOD_HELP), oPC);
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eLink, oPC);
|
||||
}
|
||||
|
||||
void main()
|
||||
{
|
||||
int nEvent = GetUserDefinedItemEventNumber();
|
||||
object oPC;
|
||||
object oItem;
|
||||
|
||||
// Debug message
|
||||
if(DEBUG) DoDebug("jy_itnk_amf5 >> Event: " + IntToString(nEvent));
|
||||
|
||||
switch (nEvent)
|
||||
{
|
||||
// Item equipped (any item)
|
||||
case X2_ITEM_EVENT_EQUIP:
|
||||
oPC = GetPCItemLastEquippedBy();
|
||||
oItem = GetPCItemLastEquipped();
|
||||
|
||||
if(DEBUG) DoDebug("jy_itnk_amf5 >> Equipped: " + GetName(oItem));
|
||||
|
||||
// If this is our amulet being equipped
|
||||
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
|
||||
{
|
||||
// Register for equipment change events
|
||||
AddEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
AddEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
|
||||
// Apply effect if unarmed
|
||||
if (GetIsUnarmed(oPC))
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
// If a weapon is equipped while wearing the amulet, remove the effect
|
||||
else if (WearingAmulet(oPC) && !GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf5 >> Removing effect due to weapon equip");
|
||||
RemoveAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
// Item unequipped (any item)
|
||||
case X2_ITEM_EVENT_UNEQUIP:
|
||||
oPC = GetPCItemLastUnequippedBy();
|
||||
oItem = GetPCItemLastUnequipped();
|
||||
|
||||
if(DEBUG) DoDebug("jy_itnk_amf5 >> Unequipped: " + GetName(oItem));
|
||||
|
||||
// If this is our amulet being unequipped
|
||||
if (GetResRef(oItem) == AMULET_RES || GetTag(oItem) == AMULET_RES)
|
||||
{
|
||||
// Remove effect immediately when amulet is unequipped
|
||||
RemoveAmuletEffect(oPC);
|
||||
|
||||
// Unregister events
|
||||
RemoveEventScript(oPC, EVENT_ONPLAYEREQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
RemoveEventScript(oPC, EVENT_ONPLAYERUNEQUIPITEM, SCRIPT_NAME, TRUE, FALSE);
|
||||
}
|
||||
// If a weapon is unequipped while wearing the amulet, and PC is now unarmed,
|
||||
// apply the effect
|
||||
else if (WearingAmulet(oPC) && GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf5 >> Adding effect due to weapon unequip");
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
// Handle PRC eventhooks
|
||||
case EVENT_ONPLAYEREQUIPITEM:
|
||||
oPC = GetPCItemLastEquippedBy();
|
||||
oItem = GetPCItemLastEquipped();
|
||||
|
||||
// If not wearing the amulet, do nothing
|
||||
if (!WearingAmulet(oPC))
|
||||
return;
|
||||
|
||||
// If a weapon was equipped, remove the amulet effect
|
||||
if (!GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf5 >> PRC Eventhook: Removing effect due to weapon equip");
|
||||
RemoveAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
|
||||
case EVENT_ONPLAYERUNEQUIPITEM:
|
||||
oPC = GetPCItemLastUnequippedBy();
|
||||
oItem = GetPCItemLastUnequipped();
|
||||
|
||||
// If not wearing the amulet, do nothing
|
||||
if (!WearingAmulet(oPC))
|
||||
return;
|
||||
|
||||
// If they're now unarmed after unequipping something, apply the effect
|
||||
if (GetIsUnarmed(oPC))
|
||||
{
|
||||
if(DEBUG) DoDebug("jy_itnk_amf5 >> PRC Eventhook: Adding effect due to weapon unequip");
|
||||
ApplyAmuletEffect(oPC);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
@ -18,6 +18,86 @@
|
||||
//:: Adds Evolved SLA's to jCreature.
|
||||
//::
|
||||
json json_AddEvolvedPowers(json jCreature, int nBaseHD, int nCasterLevel, int iEvolution)
|
||||
{
|
||||
int nAttempts = 0;
|
||||
json jSpecAbilityList = GffGetList(jCreature, "SpecAbilityList");
|
||||
if (jSpecAbilityList == JsonNull()) jSpecAbilityList = JsonArray();
|
||||
|
||||
while (nAttempts < 20) // safety cap
|
||||
{
|
||||
nAttempts++;
|
||||
int nRandom = d12(1);
|
||||
json jSpecAbility = JsonObject();
|
||||
|
||||
switch(nRandom)
|
||||
{
|
||||
case 1:
|
||||
if (nBaseHD < 6) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 18);
|
||||
break;
|
||||
case 2:
|
||||
if (nBaseHD < 5) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 23);
|
||||
break;
|
||||
case 3:
|
||||
if (nBaseHD < 4) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 25);
|
||||
break;
|
||||
case 4:
|
||||
if (nBaseHD < 3) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 26);
|
||||
break;
|
||||
case 5:
|
||||
if (nBaseHD < 3) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 27);
|
||||
break;
|
||||
case 6:
|
||||
if (nBaseHD < 7) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 364);
|
||||
break;
|
||||
case 7:
|
||||
if (nBaseHD < 5) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 67);
|
||||
break;
|
||||
case 8:
|
||||
if (nBaseHD < 4) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 88);
|
||||
break;
|
||||
case 9:
|
||||
if (nBaseHD < 3) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 78);
|
||||
break;
|
||||
case 10:
|
||||
if (nBaseHD < 4) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 82);
|
||||
break;
|
||||
case 11:
|
||||
if (nBaseHD < 2) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 157);
|
||||
break;
|
||||
case 12:
|
||||
if (nBaseHD < 5) continue;
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 566);
|
||||
break;
|
||||
default:
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 46); // Doom fallback
|
||||
break;
|
||||
}
|
||||
|
||||
// If jSpecAbility still empty for some reason, retry
|
||||
if (JsonGetType(jSpecAbility) != JSON_TYPE_OBJECT) continue;
|
||||
|
||||
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", PRCMax(nCasterLevel, nBaseHD));
|
||||
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
|
||||
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
|
||||
break;
|
||||
}
|
||||
|
||||
return GffAddList(jCreature, "SpecAbilityList", jSpecAbilityList);
|
||||
}
|
||||
|
||||
|
||||
/* json json_AddEvolvedPowers(json jCreature, int nBaseHD, int nCasterLevel, int iEvolution)
|
||||
{
|
||||
int nRandom = d12(1);
|
||||
|
||||
@ -44,7 +124,7 @@ json json_AddEvolvedPowers(json jCreature, int nBaseHD, int nCasterLevel, int iE
|
||||
12 unholy blight 566 - 5th
|
||||
*/
|
||||
|
||||
switch(nRandom)
|
||||
/* switch(nRandom)
|
||||
{
|
||||
case 1:
|
||||
if (nBaseHD >= 6)
|
||||
@ -302,6 +382,7 @@ json json_AddEvolvedPowers(json jCreature, int nBaseHD, int nCasterLevel, int iE
|
||||
|
||||
return jCreature = GffAddList(jCreature, "SpecAbilityList", jSpecAbilityList);
|
||||
}
|
||||
*/
|
||||
|
||||
//:: Apply Evolved effects to a non-PC creature
|
||||
void ApplyEvolvedEffects(object oCreature, int nBaseHD, int nCasterLevel, int iEvolution)
|
||||
@ -340,34 +421,47 @@ void main()
|
||||
object oBaseCreature = OBJECT_SELF;
|
||||
object oNewCreature;
|
||||
|
||||
GetObjectUUID(oBaseCreature);
|
||||
|
||||
int bIncorporeal = GetIsIncorporeal(oBaseCreature);
|
||||
int iBaseRace = MyPRCGetRacialType(oBaseCreature);
|
||||
int nCasterLevel = PRCGetCasterLevel(oBaseCreature);
|
||||
|
||||
int iEvolution = GetLocalInt(oBaseCreature, "UNDEAD_EVOLUTION");
|
||||
int iEvolution = 1;
|
||||
int iOldEvolution = GetLocalInt(oBaseCreature, "UNDEAD_EVOLUTION");
|
||||
|
||||
//:: Creatures & NPCs only
|
||||
if ((GetObjectType(oBaseCreature) != OBJECT_TYPE_CREATURE) || (GetIsPC(oBaseCreature) == TRUE))
|
||||
{
|
||||
if(DEBUG) DoDebug("Not a creature");
|
||||
DoDebug("Not a creature");
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
//:: Undead only
|
||||
if(iBaseRace != RACIAL_TYPE_UNDEAD)
|
||||
{
|
||||
//SendMessageToPC(GetFirstPC(), "make_evolved: Invalid racial type for template.");
|
||||
if(DEBUG) DoDebug("make_evolved: Invalid racial type for template.");
|
||||
DoDebug("make_evolved: Invalid racial type for template.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
if(DEBUG) DoDebug("make_evolved: Previous Evolution is: " +IntToString(iOldEvolution));
|
||||
|
||||
iEvolution = iEvolution + iOldEvolution;
|
||||
|
||||
if(DEBUG) DoDebug("make_evolved: Evolution is: " +IntToString(iEvolution));
|
||||
|
||||
int nBaseHD = GetHitDice(oBaseCreature);
|
||||
int nBaseCR = FloatToInt(GetChallengeRating(oBaseCreature));
|
||||
|
||||
json jBaseCreature = ObjectToJson(oBaseCreature, TRUE);
|
||||
location lSpawnLoc = GetLocation(oBaseCreature);
|
||||
|
||||
json jBaseCreature = ObjectToJson(oBaseCreature, FALSE);
|
||||
json jNewCreature;
|
||||
json jFinalCreature;
|
||||
|
||||
//:: Get original name
|
||||
string sBaseName = GetName(oBaseCreature);
|
||||
|
||||
//:: Add Spell-like abilities
|
||||
jNewCreature = json_AddEvolvedPowers(jBaseCreature, nBaseHD, nCasterLevel, iEvolution);
|
||||
|
||||
@ -381,35 +475,52 @@ void main()
|
||||
{
|
||||
jNewCreature = json_UpdateCreatureStats(jNewCreature, oBaseCreature, 2, 0, 0, 0, 0, 2);
|
||||
}
|
||||
|
||||
//:: Delete original creature.
|
||||
if (GetIsObjectValid(oBaseCreature))
|
||||
{
|
||||
AssignCommand(oBaseCreature, ClearAllActions(TRUE));
|
||||
|
||||
// optional fade / vanish visuals
|
||||
effect eBlank = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlank, oBaseCreature, 6.0f);
|
||||
|
||||
DestroyObject(oBaseCreature, 0.1f);
|
||||
}
|
||||
|
||||
//:: Update CR
|
||||
jFinalCreature = json_UpdateCR(jNewCreature, nBaseCR, 1);
|
||||
|
||||
//:: Update the creature
|
||||
oNewCreature = JsonToObject(jFinalCreature, GetLocation(oBaseCreature));
|
||||
DestroyObject(oBaseCreature, 0.0f);
|
||||
oNewCreature = JsonToObject(jFinalCreature, lSpawnLoc);
|
||||
|
||||
//:: Apply effects
|
||||
ApplyEvolvedEffects(oNewCreature, nBaseHD, nCasterLevel, iEvolution);
|
||||
|
||||
PRCForceRest(oNewCreature);
|
||||
|
||||
//:: Update creature's name on first advancement
|
||||
string sBaseName = GetName(oNewCreature);
|
||||
if(iEvolution < 1)
|
||||
//:: Update name
|
||||
if(DEBUG) DoDebug("make_evolved: Final evolution is: " +IntToString(iEvolution));
|
||||
if (iEvolution == 1)
|
||||
{
|
||||
SetName(oNewCreature, "Evolved "+ sBaseName);
|
||||
SetName(oNewCreature, "Evolved " + sBaseName);
|
||||
}
|
||||
if(iEvolution < 4)
|
||||
else if (iEvolution == 2)
|
||||
{
|
||||
SetName(oNewCreature, "Greater "+ sBaseName);
|
||||
SetName(oNewCreature, "Greater " + sBaseName);
|
||||
}
|
||||
else
|
||||
{
|
||||
SetName(oNewCreature, sBaseName);
|
||||
}
|
||||
//:: Update race field
|
||||
SetSubRace(oNewCreature, "Undead (Augmented)");
|
||||
|
||||
|
||||
//:: Update age
|
||||
SetAge(oNewCreature, GetAge(oNewCreature) + d100(1));
|
||||
|
||||
//:: Freshen up
|
||||
//DelayCommand(0.0f, PRCForceRest(oNewCreature));
|
||||
|
||||
//:: Set variables
|
||||
SetLocalInt(oNewCreature, "UNDEAD_EVOLUTION", iEvolution+1);
|
||||
SetLocalInt(oNewCreature, "UNDEAD_EVOLUTION", iEvolution);
|
||||
SetLocalInt(oNewCreature, "TEMPLATE_EVOLVED", 1);
|
||||
}
|
259
_module/nss/make_greenbound.nss
Normal file
259
_module/nss/make_greenbound.nss
Normal file
@ -0,0 +1,259 @@
|
||||
/* Greenbound Creature Template
|
||||
|
||||
By: Jaysyn
|
||||
Created: 2025-09-06 22:24:15
|
||||
|
||||
A greenbound creature looks much like it did before
|
||||
transformation, although certain changes are apparent.
|
||||
The creature's flesh has been replaced by pulpy wood
|
||||
and thickly corded creepers, and tiny branches stick
|
||||
out from its torso, arms, and legs. Any feathers, hair,
|
||||
or fur it once had have been replaced by some combination
|
||||
of green vines, moss, flowers, and leaves.
|
||||
|
||||
Greenbound creatures speak any languages they knew before
|
||||
transformation, although their voices are now deep and
|
||||
gravelly.
|
||||
|
||||
/*///////////////////////////////////////////////////////////
|
||||
|
||||
#include "nw_inc_gff"
|
||||
#include "prc_inc_spells"
|
||||
#include "prc_inc_util"
|
||||
#include "npc_template_inc"
|
||||
#include "inc_debug"
|
||||
#include "prc_inc_json"
|
||||
|
||||
//:: Adds Greenbound SLA's to jCreature.
|
||||
//::
|
||||
json json_AddGreenboundPowers(json jCreature)
|
||||
{
|
||||
// Get the existing SpecAbilityList (if it exists)
|
||||
json jSpecAbilityList = GffGetList(jCreature, "SpecAbilityList");
|
||||
|
||||
//:: Get creature's HD
|
||||
int iHD = json_GetCreatureHD(jCreature);
|
||||
|
||||
// Create the SpecAbilityList if it doesn't exist
|
||||
if (jSpecAbilityList == JsonNull())
|
||||
{
|
||||
jSpecAbilityList = JsonArray();
|
||||
}
|
||||
|
||||
//:: Add Entangle at will (capped @ 20)
|
||||
int i;
|
||||
for (i = 0; i < 20; i++)
|
||||
{
|
||||
json jSpecAbility = JsonObject();
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 53);
|
||||
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", iHD);
|
||||
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
|
||||
|
||||
// Manually add to the array
|
||||
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
|
||||
}
|
||||
|
||||
//:: Add Vine Mine 1x / Day
|
||||
for (i = 0; i < 1; i++)
|
||||
{
|
||||
json jSpecAbility = JsonObject();
|
||||
jSpecAbility = GffAddWord(jSpecAbility, "Spell", 529);
|
||||
jSpecAbility = GffAddByte(jSpecAbility, "SpellCasterLevel", iHD);
|
||||
jSpecAbility = GffAddByte(jSpecAbility, "SpellFlags", 1);
|
||||
|
||||
// Manually add to the array
|
||||
jSpecAbilityList = JsonArrayInsert(jSpecAbilityList, jSpecAbility);
|
||||
}
|
||||
|
||||
//:: Add the list to the creature
|
||||
jCreature = GffAddList(jCreature, "SpecAbilityList", jSpecAbilityList);
|
||||
|
||||
return jCreature;
|
||||
}
|
||||
|
||||
//:: Apply Greenbound effects
|
||||
void ApplyGreenboundEffects(object oCreature, int nBaseHD)
|
||||
{
|
||||
//:: Declare major variables
|
||||
int nNewCR;
|
||||
object oSkin = GetPCSkin(oCreature);
|
||||
|
||||
itemproperty ipIP;
|
||||
|
||||
effect eGreenbound;
|
||||
|
||||
//:: Give it a barkskin vfx
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectVisualEffect(VFX_DUR_PROT_BARKSKIN));
|
||||
|
||||
//:: Plant Immunities
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectImmunity(IMMUNITY_TYPE_STUN));
|
||||
|
||||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_PARALYSIS);
|
||||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||||
|
||||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_POISON);
|
||||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||||
|
||||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_MINDSPELLS);
|
||||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||||
|
||||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_CRITICAL_HITS);
|
||||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||||
|
||||
ipIP =ItemPropertyImmunityMisc(IP_CONST_IMMUNITYMISC_BACKSTAB);
|
||||
IPSafeAddItemProperty(oSkin, ipIP, 0.0, X2_IP_ADDPROP_POLICY_REPLACE_EXISTING, FALSE, FALSE);
|
||||
|
||||
//:: Set maximum hit points for each HD
|
||||
int nMaxHP = GetMaxPossibleHP(oCreature);
|
||||
SetCurrentHitPoints(oCreature, nMaxHP);
|
||||
|
||||
DoDebug("nMaxHP is: "+IntToString(nMaxHP)+",");
|
||||
|
||||
//:: Resistance to Cold and Electricity (Ex): A greenbound creature gains resistance 10 to cold and electricity.
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageResistance(DAMAGE_TYPE_ELECTRICAL, 10));
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageResistance(DAMAGE_TYPE_COLD, 10));
|
||||
|
||||
//:: Damage Reduction (Ex): A greenbound creature has damage reduction 10/magic and slashing.
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageReduction(10, DAMAGE_POWER_PLUS_ONE));
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageResistance(DAMAGE_TYPE_BLUDGEONING, 10));
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectDamageResistance(DAMAGE_TYPE_PIERCING, 10));
|
||||
|
||||
//:: Fast Healing (Ex): A greenbound creature heals 3 points of damage each round so long as it has at least 1 hit point.
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectRegenerate(3, 6.0f));
|
||||
|
||||
//:: Tremorsense (Ex): Greenbound creatures can automatically sense the location of
|
||||
//:: anything within 60 feet that is in contact with the ground.
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(488));
|
||||
|
||||
//:: Grapple Bonus (Ex): The thorny hooks on a greenbound creature's hands and feet
|
||||
//:: grant it a +4 bonus on grapple checks. (Imp. Grapple)
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(2804));
|
||||
|
||||
//:: Immunity to Critical Hits
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(3585));
|
||||
|
||||
//:: Immunity to Sneak Attack
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(3591));
|
||||
|
||||
//:: Immunity to Poison
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(3590));
|
||||
|
||||
//:: Immunity to Mind Effects
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(3588));
|
||||
|
||||
//:: Low-Light Vision
|
||||
eGreenbound = EffectLinkEffects(eGreenbound, EffectBonusFeat(354));
|
||||
|
||||
//:: Make *really* permanent
|
||||
eGreenbound = UnyieldingEffect(eGreenbound);
|
||||
|
||||
//:: Apply everything
|
||||
ApplyEffectToObject(DURATION_TYPE_PERMANENT, eGreenbound, oCreature);
|
||||
|
||||
//:: Add slam attack
|
||||
string sResRef;
|
||||
int nSize = PRCGetCreatureSize(oCreature);
|
||||
//primary weapon
|
||||
sResRef = "prc_warf_slam_";
|
||||
sResRef += GetAffixForSize(nSize+1);
|
||||
AddNaturalPrimaryWeapon(oCreature, sResRef, 1);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void main ()
|
||||
{
|
||||
//:: Declare major variables
|
||||
object oBaseCreature = OBJECT_SELF;
|
||||
object oNewCreature;
|
||||
|
||||
string sBaseName = GetName(oBaseCreature);
|
||||
|
||||
GetObjectUUID(oBaseCreature);
|
||||
|
||||
int nRacial = MyPRCGetRacialType(oBaseCreature);
|
||||
|
||||
//:: No Template Stacking
|
||||
if(GetLocalInt(oBaseCreature, "TEMPLATE_GREENBOUND") > 0)
|
||||
{
|
||||
if(DEBUG) DoDebug("No Template Stacking");
|
||||
return;
|
||||
}
|
||||
|
||||
//:: Creatures & NPCs only
|
||||
if ((GetObjectType(oBaseCreature) != OBJECT_TYPE_CREATURE) || (GetIsPC(oBaseCreature) == TRUE))
|
||||
{
|
||||
if(DEBUG) DoDebug("Not a creature");
|
||||
return;
|
||||
}
|
||||
/*
|
||||
|
||||
A "greenbound creature" is an acquired template that can be added to
|
||||
any animal, fey, giant, humanoid, monstrous humanoid, or vermin.
|
||||
|
||||
*/
|
||||
if(nRacial == RACIAL_TYPE_ABERRATION || nRacial == RACIAL_TYPE_CONSTRUCT || nRacial == RACIAL_TYPE_DRAGON ||
|
||||
nRacial == RACIAL_TYPE_ELEMENTAL || nRacial == RACIAL_TYPE_MAGICAL_BEAST || nRacial == RACIAL_TYPE_OOZE ||
|
||||
nRacial == RACIAL_TYPE_OUTSIDER || nRacial == RACIAL_TYPE_PLANT || nRacial == RACIAL_TYPE_UNDEAD )
|
||||
{
|
||||
DoDebug("make_greenbound: Invalid racial type for template.");
|
||||
return;
|
||||
}
|
||||
|
||||
int nBaseHD = GetHitDice(oBaseCreature);
|
||||
int nBaseCR = FloatToInt(GetChallengeRating(oBaseCreature));
|
||||
|
||||
location lSpawnLoc = GetLocation(oBaseCreature);
|
||||
|
||||
json jBaseCreature = ObjectToJson(oBaseCreature, TRUE);
|
||||
json jNewCreature;
|
||||
json jFinalCreature;
|
||||
|
||||
//:: The creature's type changes to plant with the appropriate augmented subtype.
|
||||
//:: Hit Dice: Change all current Hit Dice to d8s.
|
||||
jNewCreature = JsonModifyRacialType(jBaseCreature, RACIAL_TYPE_PLANT);
|
||||
|
||||
//:: Armor Class: A greenbound creature's natural armor bonus improves by 6 over that of the base creature.
|
||||
jNewCreature = json_IncreaseBaseAC(jNewCreature, 6);
|
||||
|
||||
//:: Abilities: Increase from the base creature as follows: Str +6, Dex +2, Con +4, Cha +4.
|
||||
jNewCreature = json_UpdateCreatureStats(jNewCreature, oBaseCreature, 6, 2, 4, 0, 0, 4);
|
||||
|
||||
if (GetIsObjectValid(oBaseCreature))
|
||||
{
|
||||
AssignCommand(oBaseCreature, ClearAllActions(TRUE));
|
||||
|
||||
// optional fade / vanish visuals
|
||||
effect eBlank = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlank, oBaseCreature, 6.0f);
|
||||
|
||||
DestroyObject(oBaseCreature, 0.1f);
|
||||
}
|
||||
|
||||
//:: Spell-Like Abilities: At will - entangle, pass without trace, speak with plants; 1/day - wall of thorns.
|
||||
jNewCreature = json_AddGreenboundPowers(jNewCreature);
|
||||
|
||||
//:: Hit Dice: Change all current Hit Dice to d8s.
|
||||
jNewCreature = json_RecalcMaxHP(jNewCreature, 8);
|
||||
|
||||
//:: Challenge Rating: Same as the base creature +2
|
||||
jFinalCreature = json_UpdateCR(jNewCreature, nBaseCR, 2);
|
||||
|
||||
//:: Update the creature
|
||||
oNewCreature = JsonToObject(jFinalCreature, lSpawnLoc);
|
||||
|
||||
//:: Apply the non-json effects
|
||||
ApplyGreenboundEffects(oNewCreature, nBaseHD);
|
||||
|
||||
//:: Update creature's name
|
||||
SetName(oNewCreature, "Greenbound "+ sBaseName);
|
||||
|
||||
//:: Update race field
|
||||
SetSubRace(oNewCreature, "Plant (Augmented)");
|
||||
|
||||
//:: Freshen Up
|
||||
//DelayCommand(0.0f, PRCForceRest(oNewCreature));
|
||||
|
||||
//:: Set variables
|
||||
SetLocalInt(oNewCreature, "TEMPLATE_GREENBOUND", 1);
|
||||
}
|
@ -448,6 +448,10 @@ void main ()
|
||||
object oBaseCreature = OBJECT_SELF;
|
||||
object oNewCreature;
|
||||
|
||||
location lSpawnLoc = GetLocation(oBaseCreature);
|
||||
|
||||
GetObjectUUID(oBaseCreature);
|
||||
|
||||
//:: No Template Stacking
|
||||
if(GetLocalInt(oBaseCreature, "TEMPLATE_PARAGON") > 0)
|
||||
{
|
||||
@ -474,14 +478,23 @@ void main ()
|
||||
jNewCreature = json_UpdateBaseAC(jNewCreature, 5);
|
||||
jFinalCreature = json_UpdateCreatureStats(jNewCreature, oBaseCreature, 15, 15, 15, 15, 15, 15);
|
||||
|
||||
//:: Delete original creature.
|
||||
if (GetIsObjectValid(oBaseCreature))
|
||||
{
|
||||
AssignCommand(oBaseCreature, ClearAllActions(TRUE));
|
||||
|
||||
// optional fade / vanish visuals
|
||||
effect eBlank = EffectVisualEffect(VFX_DUR_CUTSCENE_INVISIBILITY);
|
||||
ApplyEffectToObject(DURATION_TYPE_TEMPORARY, eBlank, oBaseCreature, 6.0f);
|
||||
|
||||
DestroyObject(oBaseCreature, 0.1f);
|
||||
}
|
||||
|
||||
//:: Update the creature
|
||||
oNewCreature = JsonToObject(jFinalCreature, GetLocation(oBaseCreature));
|
||||
DestroyObject(oBaseCreature, 0.0f);
|
||||
oNewCreature = JsonToObject(jFinalCreature, lSpawnLoc);
|
||||
|
||||
//:: Apply effects
|
||||
ApplyParagonEffects(oNewCreature, nBaseHD, nBaseCR);
|
||||
|
||||
PRCForceRest(oNewCreature);
|
||||
|
||||
//:: Adding extra 12 HP per HD as Temporary HP.
|
||||
effect eTempHP = EffectTemporaryHitpoints(nBaseHD * 12);
|
||||
@ -491,5 +504,9 @@ void main ()
|
||||
string sBaseName = GetName(oNewCreature);
|
||||
SetName(oNewCreature, "Paragon "+ sBaseName);
|
||||
|
||||
//:: Freshen Up
|
||||
//DelayCommand(0.0f, PRCForceRest(oNewCreature));
|
||||
|
||||
//:: Set variables
|
||||
SetLocalInt(oNewCreature, "TEMPLATE_PARAGON", 1);
|
||||
}
|
@ -64,9 +64,11 @@
|
||||
|
||||
///// FUNCTION DECLARATIONS ////////////////////////////////////////////////////
|
||||
|
||||
string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF);
|
||||
//:: Function to get the class type with the highest level
|
||||
int GetHighestClassType(object oCreature);
|
||||
|
||||
int GetHighestClassLevel(object oCreature = OBJECT_SELF);
|
||||
//:: Returns class level based NPC titles
|
||||
string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF);
|
||||
|
||||
// Generates a Random First Name
|
||||
// based on Race and Gender
|
||||
@ -103,7 +105,10 @@ void ms_Nomenclature(object oNPC = OBJECT_SELF)
|
||||
//:: Handles class level based NPC titles
|
||||
if (bClassTitle)
|
||||
{
|
||||
sClassTitle = GetClassLevelTitle(GetHighestClassLevel(oNPC), oNPC);
|
||||
int nClassType = GetHighestClassType(oNPC);
|
||||
sClassTitle = GetClassLevelTitle(nClassType, oNPC);
|
||||
|
||||
FloatingTextStringOnCreature("Title: " + sClassTitle, oNPC);
|
||||
}
|
||||
|
||||
//:: Handles class based Henchman titles
|
||||
@ -972,7 +977,7 @@ void ms_Nomenclature(object oNPC = OBJECT_SELF)
|
||||
|
||||
if (bClassTitle)
|
||||
{
|
||||
sRandomName = sBaseRace +" "+ sTitle;
|
||||
sRandomName = sBaseRace +" "+ sClassTitle;
|
||||
}
|
||||
|
||||
SetName(oNPC, (sRandomName));
|
||||
@ -1048,34 +1053,38 @@ string ms_RandomLastName(object oNPC = OBJECT_SELF)
|
||||
return Name;
|
||||
}
|
||||
|
||||
//:: Function to get the highest class level of an object, excluding racialtype classes
|
||||
int GetHighestClassLevel(object oCreature)
|
||||
//:: Function to get the class type with the highest level
|
||||
int GetHighestClassType(object oCreature)
|
||||
{
|
||||
int nHighestLevel = -1;
|
||||
int nClassTypes = 254; // Maximum number of class types
|
||||
int i;
|
||||
int nHighestClass = -1;
|
||||
int nClassTypes = 254; // maximum
|
||||
|
||||
for (i = 0; i <= nClassTypes; i++)
|
||||
int i = 0;
|
||||
while (i <= nClassTypes)
|
||||
{
|
||||
// Check if the class type is excluded
|
||||
// Exclude racial/monster pseudo-classes
|
||||
if (i == CLASS_TYPE_ABERRATION ||
|
||||
i == CLASS_TYPE_ANIMAL ||
|
||||
i == CLASS_TYPE_BEAST ||
|
||||
i == CLASS_TYPE_CONSTRUCT ||
|
||||
i == CLASS_TYPE_DRAGON ||
|
||||
i == CLASS_TYPE_ELEMENTAL ||
|
||||
i == CLASS_TYPE_FEY ||
|
||||
i == CLASS_TYPE_GIANT ||
|
||||
i == CLASS_TYPE_HUMANOID ||
|
||||
i == CLASS_TYPE_MAGICAL_BEAST ||
|
||||
i == CLASS_TYPE_MONSTROUS ||
|
||||
i == CLASS_TYPE_OOZE ||
|
||||
i == CLASS_TYPE_OUTSIDER ||
|
||||
i == CLASS_TYPE_PLANT ||
|
||||
i == CLASS_TYPE_SHAPECHANGER ||
|
||||
i == CLASS_TYPE_UNDEAD ||
|
||||
i == CLASS_TYPE_VERMIN)
|
||||
i == CLASS_TYPE_ANIMAL ||
|
||||
i == CLASS_TYPE_BEAST ||
|
||||
i == CLASS_TYPE_CONSTRUCT ||
|
||||
i == CLASS_TYPE_DRAGON ||
|
||||
i == CLASS_TYPE_ELEMENTAL ||
|
||||
i == CLASS_TYPE_FEY ||
|
||||
i == CLASS_TYPE_GIANT ||
|
||||
i == CLASS_TYPE_HUMANOID ||
|
||||
i == CLASS_TYPE_MAGICAL_BEAST ||
|
||||
i == CLASS_TYPE_MONSTROUS ||
|
||||
i == CLASS_TYPE_OOZE ||
|
||||
i == CLASS_TYPE_OUTSIDER ||
|
||||
i == CLASS_TYPE_PLANT ||
|
||||
i == CLASS_TYPE_SHAPECHANGER ||
|
||||
i == CLASS_TYPE_UNDEAD ||
|
||||
i == CLASS_TYPE_VERMIN)
|
||||
{
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
|
||||
int nLevel = GetLevelByClass(i, oCreature);
|
||||
if (nLevel > 0)
|
||||
@ -1083,27 +1092,29 @@ int GetHighestClassLevel(object oCreature)
|
||||
if (nLevel > nHighestLevel)
|
||||
{
|
||||
nHighestLevel = nLevel;
|
||||
nHighestClass = i;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
break; // Reached an invalid class level, exit the loop
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
return nHighestLevel;
|
||||
if (nHighestClass != -1)
|
||||
{
|
||||
FloatingTextStringOnCreature("Highest Level class is " + IntToString(nHighestClass) +
|
||||
" at level " + IntToString(nHighestLevel) + ".", oCreature);
|
||||
}
|
||||
|
||||
return nHighestClass;
|
||||
}
|
||||
|
||||
|
||||
//:: Handles class level based NPC titles
|
||||
//:: Returns class level based NPC titles
|
||||
string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
{
|
||||
string sTitle;
|
||||
int nHighClass = GetHighestClassLevel(oNPC);
|
||||
int nLevel = GetLevelByClass(nHighClass, oNPC);
|
||||
int nGender = GetGender(oNPC);
|
||||
|
||||
switch (nHighClass)
|
||||
string sTitle;
|
||||
int nLevel = GetLevelByClass(nClassType, oNPC);
|
||||
int nGender = GetGender(oNPC);
|
||||
|
||||
switch (nClassType)
|
||||
{
|
||||
case CLASS_TYPE_BARBARIAN:
|
||||
switch(nLevel)
|
||||
@ -1174,8 +1185,8 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
{sTitle = "Conqueress"; break;}
|
||||
else
|
||||
{sTitle = "Conqueror"; break;}
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_ROGUE:
|
||||
switch(nLevel)
|
||||
@ -1236,6 +1247,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "Master Rogue"; break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_BARD:
|
||||
switch(nLevel)
|
||||
@ -1335,6 +1347,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "Master Bard"; break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_SORCERER:
|
||||
case CLASS_TYPE_WIZARD:
|
||||
@ -1396,6 +1409,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "Archmage"; break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_CLERIC:
|
||||
switch(nLevel)
|
||||
@ -1468,6 +1482,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
{sTitle = "High Priest"; break;}
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_DRUID:
|
||||
switch(nLevel)
|
||||
@ -1528,6 +1543,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "Archdruid"; break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_FIGHTER:
|
||||
switch(nLevel)
|
||||
@ -1588,6 +1604,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "Grandmaster"; break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_MONK:
|
||||
switch(nLevel)
|
||||
@ -1659,6 +1676,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "High Master"; break;
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_PALADIN:
|
||||
switch(nLevel)
|
||||
@ -1730,7 +1748,8 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "High Master"; break;
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case CLASS_TYPE_RANGER:
|
||||
switch(nLevel)
|
||||
{
|
||||
@ -1817,7 +1836,7 @@ string GetClassLevelTitle(int nClassType, object oNPC = OBJECT_SELF)
|
||||
sTitle = "Ranger Lord"; break;
|
||||
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return sTitle;
|
||||
|
@ -81,7 +81,10 @@ void main()
|
||||
string sCurrentDate = SQLite_GetSystemDate();
|
||||
string sMonthDay = GetSubString(sCurrentDate, 0, 5);
|
||||
|
||||
object oArea = GetArea(OBJECT_SELF);
|
||||
object oArea = GetArea(OBJECT_SELF);
|
||||
int bIsNatural = GetIsAreaNatural(oArea);
|
||||
int bAboveGround = GetIsAreaAboveGround(oArea);
|
||||
|
||||
object oSkelly;
|
||||
object oPC = GetFirstObjectInArea(oArea);
|
||||
|
||||
@ -137,7 +140,7 @@ void main()
|
||||
}
|
||||
|
||||
//:: Paragon Check
|
||||
if (Random(9999) == 0)
|
||||
if (Random(10000) == 0)
|
||||
{
|
||||
if(GetLocalInt(OBJECT_SELF, "TEMPLATE_PARAGON") < 1)
|
||||
{
|
||||
@ -145,6 +148,37 @@ void main()
|
||||
}
|
||||
}
|
||||
|
||||
//:: Greenbound Check
|
||||
if (bIsNatural && bAboveGround)
|
||||
{
|
||||
if (iRacial == RACIAL_TYPE_FEY
|
||||
|| iRacial == RACIAL_TYPE_ANIMAL
|
||||
|| iRacial == RACIAL_TYPE_BEAST
|
||||
|| iRacial == RACIAL_TYPE_GIANT
|
||||
|| iRacial == RACIAL_TYPE_VERMIN)
|
||||
{
|
||||
if (Random(1000) == 0)
|
||||
{
|
||||
if (GetLocalInt(OBJECT_SELF, "TEMPLATE_GREENBOUND") < 1)
|
||||
{
|
||||
ExecuteScript("make_greenbound", OBJECT_SELF);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DEBUG) DoDebug("prc_pwonspawn >> Greenbound Check: Creature already has the Greenbound template.");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DEBUG) DoDebug("prc_pwonspawn >> Greenbound Check: Invalid racial type for template.");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (DEBUG) DoDebug("prc_pwonspawn >> Greenbound Check: Area must be natural & above ground.");
|
||||
}
|
||||
|
||||
//:: Setup Evolved Undead
|
||||
if(iRacial == RACIAL_TYPE_UNDEAD)
|
||||
{
|
||||
|
@ -733,14 +733,14 @@
|
||||
"__struct_id": 1,
|
||||
"Feat": {
|
||||
"type": "word",
|
||||
"value": 2511
|
||||
"value": 2510
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 1,
|
||||
"Feat": {
|
||||
"type": "word",
|
||||
"value": 2510
|
||||
"value": 2511
|
||||
}
|
||||
},
|
||||
{
|
||||
@ -848,13 +848,6 @@
|
||||
"value": 5072
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 1,
|
||||
"Feat": {
|
||||
"type": "word",
|
||||
"value": 5078
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 1,
|
||||
"Feat": {
|
||||
@ -866,7 +859,7 @@
|
||||
"__struct_id": 1,
|
||||
"Feat": {
|
||||
"type": "word",
|
||||
"value": 5090
|
||||
"value": 5078
|
||||
}
|
||||
},
|
||||
{
|
||||
@ -876,6 +869,13 @@
|
||||
"value": 878
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 1,
|
||||
"Feat": {
|
||||
"type": "word",
|
||||
"value": 5090
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 1,
|
||||
"Feat": {
|
||||
|
117
_module/uti/jy_itnk_amf1.uti.json
Normal file
117
_module/uti/jy_itnk_amf1.uti.json
Normal file
@ -0,0 +1,117 @@
|
||||
{
|
||||
"__data_type": "UTI ",
|
||||
"AddCost": {
|
||||
"type": "dword",
|
||||
"value": 5999
|
||||
},
|
||||
"BaseItem": {
|
||||
"type": "int",
|
||||
"value": 19
|
||||
},
|
||||
"Charges": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Comment": {
|
||||
"type": "cexostring",
|
||||
"value": "Amulet of Mighty Fists +1"
|
||||
},
|
||||
"Cost": {
|
||||
"type": "dword",
|
||||
"value": 6000
|
||||
},
|
||||
"Cursed": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"DescIdentified": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "This amulet grants an enhancement bonus of +1 on attack and damage rolls with unarmed attacks and natural weapons."
|
||||
}
|
||||
},
|
||||
"Description": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": ""
|
||||
}
|
||||
},
|
||||
"Identified": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"LocalizedName": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Amulet of Mighty Fists +1"
|
||||
}
|
||||
},
|
||||
"ModelPart1": {
|
||||
"type": "byte",
|
||||
"value": 24
|
||||
},
|
||||
"PaletteID": {
|
||||
"type": "byte",
|
||||
"value": 21
|
||||
},
|
||||
"Plot": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertiesList": {
|
||||
"type": "list",
|
||||
"value": [
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"ChanceAppear": {
|
||||
"type": "byte",
|
||||
"value": 100
|
||||
},
|
||||
"CostTable": {
|
||||
"type": "byte",
|
||||
"value": 28
|
||||
},
|
||||
"CostValue": {
|
||||
"type": "word",
|
||||
"value": 16
|
||||
},
|
||||
"Param1": {
|
||||
"type": "byte",
|
||||
"value": 255
|
||||
},
|
||||
"Param1Value": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertyName": {
|
||||
"type": "word",
|
||||
"value": 85
|
||||
},
|
||||
"Subtype": {
|
||||
"type": "word",
|
||||
"value": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"StackSize": {
|
||||
"type": "word",
|
||||
"value": 1
|
||||
},
|
||||
"Stolen": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "JY_ITNK_AMF1"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
"value": "jy_itnk_amf1"
|
||||
},
|
||||
"xModelPart1": {
|
||||
"type": "word",
|
||||
"value": 24
|
||||
}
|
||||
}
|
117
_module/uti/jy_itnk_amf2.uti.json
Normal file
117
_module/uti/jy_itnk_amf2.uti.json
Normal file
@ -0,0 +1,117 @@
|
||||
{
|
||||
"__data_type": "UTI ",
|
||||
"AddCost": {
|
||||
"type": "dword",
|
||||
"value": 23999
|
||||
},
|
||||
"BaseItem": {
|
||||
"type": "int",
|
||||
"value": 19
|
||||
},
|
||||
"Charges": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Comment": {
|
||||
"type": "cexostring",
|
||||
"value": "Amulet of Mighty Fists +2"
|
||||
},
|
||||
"Cost": {
|
||||
"type": "dword",
|
||||
"value": 24000
|
||||
},
|
||||
"Cursed": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"DescIdentified": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "This amulet grants an enhancement bonus of +2 on attack and damage rolls with unarmed attacks and natural weapons."
|
||||
}
|
||||
},
|
||||
"Description": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": ""
|
||||
}
|
||||
},
|
||||
"Identified": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"LocalizedName": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Amulet of Mighty Fists +2"
|
||||
}
|
||||
},
|
||||
"ModelPart1": {
|
||||
"type": "byte",
|
||||
"value": 24
|
||||
},
|
||||
"PaletteID": {
|
||||
"type": "byte",
|
||||
"value": 21
|
||||
},
|
||||
"Plot": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertiesList": {
|
||||
"type": "list",
|
||||
"value": [
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"ChanceAppear": {
|
||||
"type": "byte",
|
||||
"value": 100
|
||||
},
|
||||
"CostTable": {
|
||||
"type": "byte",
|
||||
"value": 28
|
||||
},
|
||||
"CostValue": {
|
||||
"type": "word",
|
||||
"value": 16
|
||||
},
|
||||
"Param1": {
|
||||
"type": "byte",
|
||||
"value": 255
|
||||
},
|
||||
"Param1Value": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertyName": {
|
||||
"type": "word",
|
||||
"value": 85
|
||||
},
|
||||
"Subtype": {
|
||||
"type": "word",
|
||||
"value": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"StackSize": {
|
||||
"type": "word",
|
||||
"value": 1
|
||||
},
|
||||
"Stolen": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "JY_ITNK_AMF2"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
"value": "jy_itnk_amf2"
|
||||
},
|
||||
"xModelPart1": {
|
||||
"type": "word",
|
||||
"value": 24
|
||||
}
|
||||
}
|
148
_module/uti/jy_itnk_amf3.uti.json
Normal file
148
_module/uti/jy_itnk_amf3.uti.json
Normal file
@ -0,0 +1,148 @@
|
||||
{
|
||||
"__data_type": "UTI ",
|
||||
"AddCost": {
|
||||
"type": "dword",
|
||||
"value": 23991
|
||||
},
|
||||
"BaseItem": {
|
||||
"type": "int",
|
||||
"value": 19
|
||||
},
|
||||
"Charges": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Comment": {
|
||||
"type": "cexostring",
|
||||
"value": "Amulet of Mighty Fists +3"
|
||||
},
|
||||
"Cost": {
|
||||
"type": "dword",
|
||||
"value": 54000
|
||||
},
|
||||
"Cursed": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"DescIdentified": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "This amulet grants an enhancement bonus of +3 on attack and damage rolls with unarmed attacks and natural weapons."
|
||||
}
|
||||
},
|
||||
"Description": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": ""
|
||||
}
|
||||
},
|
||||
"Identified": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"LocalizedName": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Amulet of Mighty Fists +3"
|
||||
}
|
||||
},
|
||||
"ModelPart1": {
|
||||
"type": "byte",
|
||||
"value": 24
|
||||
},
|
||||
"PaletteID": {
|
||||
"type": "byte",
|
||||
"value": 21
|
||||
},
|
||||
"Plot": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertiesList": {
|
||||
"type": "list",
|
||||
"value": [
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"ChanceAppear": {
|
||||
"type": "byte",
|
||||
"value": 100
|
||||
},
|
||||
"CostTable": {
|
||||
"type": "byte",
|
||||
"value": 35
|
||||
},
|
||||
"CostValue": {
|
||||
"type": "word",
|
||||
"value": 3
|
||||
},
|
||||
"Param1": {
|
||||
"type": "byte",
|
||||
"value": 255
|
||||
},
|
||||
"Param1Value": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertyName": {
|
||||
"type": "word",
|
||||
"value": 128
|
||||
},
|
||||
"Subtype": {
|
||||
"type": "word",
|
||||
"value": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"ChanceAppear": {
|
||||
"type": "byte",
|
||||
"value": 100
|
||||
},
|
||||
"CostTable": {
|
||||
"type": "byte",
|
||||
"value": 28
|
||||
},
|
||||
"CostValue": {
|
||||
"type": "word",
|
||||
"value": 16
|
||||
},
|
||||
"Param1": {
|
||||
"type": "byte",
|
||||
"value": 255
|
||||
},
|
||||
"Param1Value": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertyName": {
|
||||
"type": "word",
|
||||
"value": 85
|
||||
},
|
||||
"Subtype": {
|
||||
"type": "word",
|
||||
"value": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"StackSize": {
|
||||
"type": "word",
|
||||
"value": 1
|
||||
},
|
||||
"Stolen": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "JY_ITNK_AMF3"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
"value": "jy_itnk_amf3"
|
||||
},
|
||||
"xModelPart1": {
|
||||
"type": "word",
|
||||
"value": 24
|
||||
}
|
||||
}
|
148
_module/uti/jy_itnk_amf4.uti.json
Normal file
148
_module/uti/jy_itnk_amf4.uti.json
Normal file
@ -0,0 +1,148 @@
|
||||
{
|
||||
"__data_type": "UTI ",
|
||||
"AddCost": {
|
||||
"type": "dword",
|
||||
"value": 25993
|
||||
},
|
||||
"BaseItem": {
|
||||
"type": "int",
|
||||
"value": 19
|
||||
},
|
||||
"Charges": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Comment": {
|
||||
"type": "cexostring",
|
||||
"value": "Amulet of Mighty Fists +4"
|
||||
},
|
||||
"Cost": {
|
||||
"type": "dword",
|
||||
"value": 96000
|
||||
},
|
||||
"Cursed": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"DescIdentified": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "This amulet grants an enhancement bonus of +4 on attack and damage rolls with unarmed attacks and natural weapons."
|
||||
}
|
||||
},
|
||||
"Description": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": ""
|
||||
}
|
||||
},
|
||||
"Identified": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"LocalizedName": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Amulet of Mighty Fists +4"
|
||||
}
|
||||
},
|
||||
"ModelPart1": {
|
||||
"type": "byte",
|
||||
"value": 24
|
||||
},
|
||||
"PaletteID": {
|
||||
"type": "byte",
|
||||
"value": 21
|
||||
},
|
||||
"Plot": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertiesList": {
|
||||
"type": "list",
|
||||
"value": [
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"ChanceAppear": {
|
||||
"type": "byte",
|
||||
"value": 100
|
||||
},
|
||||
"CostTable": {
|
||||
"type": "byte",
|
||||
"value": 35
|
||||
},
|
||||
"CostValue": {
|
||||
"type": "word",
|
||||
"value": 7
|
||||
},
|
||||
"Param1": {
|
||||
"type": "byte",
|
||||
"value": 255
|
||||
},
|
||||
"Param1Value": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertyName": {
|
||||
"type": "word",
|
||||
"value": 128
|
||||
},
|
||||
"Subtype": {
|
||||
"type": "word",
|
||||
"value": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"ChanceAppear": {
|
||||
"type": "byte",
|
||||
"value": 100
|
||||
},
|
||||
"CostTable": {
|
||||
"type": "byte",
|
||||
"value": 28
|
||||
},
|
||||
"CostValue": {
|
||||
"type": "word",
|
||||
"value": 16
|
||||
},
|
||||
"Param1": {
|
||||
"type": "byte",
|
||||
"value": 255
|
||||
},
|
||||
"Param1Value": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertyName": {
|
||||
"type": "word",
|
||||
"value": 85
|
||||
},
|
||||
"Subtype": {
|
||||
"type": "word",
|
||||
"value": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"StackSize": {
|
||||
"type": "word",
|
||||
"value": 1
|
||||
},
|
||||
"Stolen": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "JY_ITNK_AMF4"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
"value": "jy_itnk_amf4"
|
||||
},
|
||||
"xModelPart1": {
|
||||
"type": "word",
|
||||
"value": 24
|
||||
}
|
||||
}
|
210
_module/uti/jy_itnk_amf5.uti.json
Normal file
210
_module/uti/jy_itnk_amf5.uti.json
Normal file
@ -0,0 +1,210 @@
|
||||
{
|
||||
"__data_type": "UTI ",
|
||||
"AddCost": {
|
||||
"type": "dword",
|
||||
"value": 6733
|
||||
},
|
||||
"BaseItem": {
|
||||
"type": "int",
|
||||
"value": 19
|
||||
},
|
||||
"Charges": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Comment": {
|
||||
"type": "cexostring",
|
||||
"value": "Amulet of Mighty Fists +5"
|
||||
},
|
||||
"Cost": {
|
||||
"type": "dword",
|
||||
"value": 150000
|
||||
},
|
||||
"Cursed": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"DescIdentified": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "This amulet grants an enhancement bonus of +5 on attack and damage rolls with unarmed attacks and natural weapons."
|
||||
}
|
||||
},
|
||||
"Description": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": ""
|
||||
}
|
||||
},
|
||||
"Identified": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"LocalizedName": {
|
||||
"type": "cexolocstring",
|
||||
"value": {
|
||||
"0": "Amulet of Mighty Fists +5"
|
||||
}
|
||||
},
|
||||
"ModelPart1": {
|
||||
"type": "byte",
|
||||
"value": 24
|
||||
},
|
||||
"PaletteID": {
|
||||
"type": "byte",
|
||||
"value": 21
|
||||
},
|
||||
"Plot": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertiesList": {
|
||||
"type": "list",
|
||||
"value": [
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"ChanceAppear": {
|
||||
"type": "byte",
|
||||
"value": 100
|
||||
},
|
||||
"CostTable": {
|
||||
"type": "byte",
|
||||
"value": 33
|
||||
},
|
||||
"CostValue": {
|
||||
"type": "word",
|
||||
"value": 6
|
||||
},
|
||||
"Param1": {
|
||||
"type": "byte",
|
||||
"value": 255
|
||||
},
|
||||
"Param1Value": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertyName": {
|
||||
"type": "word",
|
||||
"value": 123
|
||||
},
|
||||
"Subtype": {
|
||||
"type": "word",
|
||||
"value": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"ChanceAppear": {
|
||||
"type": "byte",
|
||||
"value": 100
|
||||
},
|
||||
"CostTable": {
|
||||
"type": "byte",
|
||||
"value": 35
|
||||
},
|
||||
"CostValue": {
|
||||
"type": "word",
|
||||
"value": 1
|
||||
},
|
||||
"Param1": {
|
||||
"type": "byte",
|
||||
"value": 255
|
||||
},
|
||||
"Param1Value": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertyName": {
|
||||
"type": "word",
|
||||
"value": 128
|
||||
},
|
||||
"Subtype": {
|
||||
"type": "word",
|
||||
"value": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"ChanceAppear": {
|
||||
"type": "byte",
|
||||
"value": 100
|
||||
},
|
||||
"CostTable": {
|
||||
"type": "byte",
|
||||
"value": 36
|
||||
},
|
||||
"CostValue": {
|
||||
"type": "word",
|
||||
"value": 1
|
||||
},
|
||||
"Param1": {
|
||||
"type": "byte",
|
||||
"value": 255
|
||||
},
|
||||
"Param1Value": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertyName": {
|
||||
"type": "word",
|
||||
"value": 129
|
||||
},
|
||||
"Subtype": {
|
||||
"type": "word",
|
||||
"value": 0
|
||||
}
|
||||
},
|
||||
{
|
||||
"__struct_id": 0,
|
||||
"ChanceAppear": {
|
||||
"type": "byte",
|
||||
"value": 100
|
||||
},
|
||||
"CostTable": {
|
||||
"type": "byte",
|
||||
"value": 28
|
||||
},
|
||||
"CostValue": {
|
||||
"type": "word",
|
||||
"value": 16
|
||||
},
|
||||
"Param1": {
|
||||
"type": "byte",
|
||||
"value": 255
|
||||
},
|
||||
"Param1Value": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"PropertyName": {
|
||||
"type": "word",
|
||||
"value": 85
|
||||
},
|
||||
"Subtype": {
|
||||
"type": "word",
|
||||
"value": 0
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"StackSize": {
|
||||
"type": "word",
|
||||
"value": 1
|
||||
},
|
||||
"Stolen": {
|
||||
"type": "byte",
|
||||
"value": 0
|
||||
},
|
||||
"Tag": {
|
||||
"type": "cexostring",
|
||||
"value": "JY_ITNK_AMF5"
|
||||
},
|
||||
"TemplateResRef": {
|
||||
"type": "resref",
|
||||
"value": "jy_itnk_amf5"
|
||||
},
|
||||
"xModelPart1": {
|
||||
"type": "word",
|
||||
"value": 24
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user