VoidExpanse > Help section

How to use ship.SetEquipmentCacheValue?

(1/3) > >>

This question is for my follower/drone mod. I want to be able to modify their damage output. If I add    IMCache.AddValue("projectile_damage_energy_weap ons_instancepercent", 1000); in the calculateShip.js script my follower/drones do a lot of damage. The thing is this parameter wasnt there to start off. I added it just to try it and it works. Now i'm wondering if i can have access to that parameter through another script with ship.SetEquipmentCacheValue?. I might be going the wrong way with this but also wanted to know: is there a list of parameters that we can assign to IMCache for weapons/items and can we have that list? This parameter "projectile_damage_energy_weap ons_instancepercent" is something i found in the skills in the .XML files. With this type of parameters I have a couple ideas on how to fake Equipment changes to my follower/drone mod.

Thank you for answering.

Edit: Is there also in the Scripting API a way to "ship.getequipment" for the NPCs? and like "ship.setequipment". Im asking coz it would be way easier than having to generate thousands of XML files with my xml file generator program I created especially if NPCS are generated and geared with different weapons when they have more than 1 weapon slots. I would have 10 times more drones xml files than weapons xml files.

unfortunately, for NPCs weapons are mapped directly from NPC XML, there is no way to change NPC weapons from scripting.
So, it makes sense to make a few NPC XMLs with particular weapons (per weapon type, multiple tiers). Giving too much choice to the player is something I would recommend to avoid as it might easily overwhelm the player. Consider having only a few presets for drones, the code generation for it is overcomplication and simply abusing the idea of XML's.

But you can modify NPC shield stats/properties, such as damage - as you found out, with the IMCache.
It's not recommended for mods to call ship.SetEquipmentCacheValue() - this method is intended to be used only by IMCache when it calculates "ship cache" (it combines stat values and bonuses from various sources and then applies them with ship.SetEquipmentCacheValue()). If you call this method directly you will overwrite the value set by IMCache (and if IMCache calculated any time later, it will overwrite your custom value). It's better to simply provide these values to IMCache instead. As you wrote, there is the CalculateShip.js script - and I think modifying it is the best way to do this.

Ok thanks for the answer. But how would I go about calling the function with "args" for example i need to include IMCache.js and CalculateShip.js. Then I call calculateShip.CalculateNpcLev eledCache(SHIP_ID?) with the ship ID as args?

Well it's not that simple... CalculateShip.js itself subscribing to OnCalculateNpcLeveledCache event:

--- Code: ---actions.Bind("OnCalculateNpcLeveledCache", "CalculateNpcLeveledCache");
--- End code ---
I think the easiest way for you will be to modify CalculateShip.js (yes, it's hacky way...).

Another way is to create a new script, also bind to "OnCalculateNpcLeveledCache" and have your custom callback method for it (just copy CalculateNpcLeveledCache code from CalculateShip.js and modify for your needs). But it will work properly only in the case if OnCalculateNpcLeveledCache first handled by CalculateShip.js and then by your script. We don't have any API to setup callbacks priority, so you can try it and see if your method called after CalculateShip.js.

ai_enabled? Do you have an explanation for the nodes:


If I do this below, it doesn't crash the game as if maybe it was made for that? But how to activate or upgrade the item ingame?:

I tried those functions here without luck:

//var upgrades0 = game.GetItemUpgrade(shipItems);
//var upgrades1 = game.GetItemUpgrades(shipItems);
//var upgrades2 = game.GetItemLevel(shipItems);
//var upgrades3 = game.GetItemLevels(shipItems);
//var test0=  items.GetItemUpgrade(items);
//var test1 = items.GetItemUpgrades(items);
//var test2 = items.GetItemLevel(items);
//var test3 = items.GetItemLevels(items);
//var test0=  items.GetItemsUpgrade(items);
//var test1 = items.GetItemsUpgrades(items);
//var test2 = items.GetItemsLevel(items);
//var test3 = items.GetItemsLevels(items);
//var test0=  game.GetItemsUpgrade(items);
//var test1 = game.GetItemsUpgrades(items);
//var test2 = game.GetItemsLevel(items);
//var test3 = game.GetItemsLevels(items);

//var test3 = items.GetItemData(items);
//var test3 = items.GetItemsData(items);

EDIT: I can put pretty much any type of string inside the node <upgrades> and the game won't crash. It's as if whatever data that the node contains, it's nullified or discarded in the core engine. maybe it is, maybe it's not.


[0] Message Index

[#] Next page

Go to full version