Buenos días,
Como parte del sistema de generación de loot aleatorio del servidor Tierra de Héroes, os presento las Dagas de Aumento.
Consiste en un objeto (la daga) y dos scripts (uno para generar dicha daga y otro para traspasar las propiedades de la daga a tu arma preferida).
Mientras lo iba desarrollando me di cuenta que (al parecer) debes usar un objeto arma para que las propiedades, en este caso bonus al daño, se puedan generar, es decir no podía aplicar a un objeto cualquiera las propiedades porque no las aceptaba. Esto parece ser una limitación del motor. O no, si alguien investiga y descubre algo más estaré encantado de saberlo.
Cómo funciona:
-Mediante la funcion CrearDagaMagica se crea un objeto en un cofre o en una criatura al morir. Esta daga tiene una propiedad IP_CONST_DAMAGETYPE_* aleatoria y una propiedad IP_CONST_DAMAGEBONUS_* configurable. Así nos queda por ejemplo una daga con +1d6 de daño ácido.
-Te equipas la daga y usas el poder unico de la daga sobre un arma cualquiera.
-La propiedad, en el ejemplo +1d6 daño ácido se pasa a nuestra arma.
Se puede usar cualquier propiedad que pueda tener un arma (dotes, bonus a skills, etc) por si quereis modificar el script.
Hay que tener en cuenta que puede subir el nivel requerido para usar el arma, en caso que tengamos ECL activado en el server.
Scripts:
Generación de daga:
#include "x2_inc_itemprop" // ///////////////////////////////////////////////////////////////////////////// // CrearDagaMagica // Crea una daga con un poder aleatorio object CrearDagaMagica(object oDondeCrearla = OBJECT_SELF, int iDamageBonus = IP_CONST_DAMAGEBONUS_1d6) { itemproperty iPoder; itemproperty ipPoderUnico = ItemPropertyCastSpell(IP_CONST_CASTSPELL_UNIQUE_POWER, IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE); object oDaga; int iCantidadDMG; int iTipoDMG; switch(d6()) { case 1: iTipoDMG = IP_CONST_DAMAGETYPE_ACID; break; case 2: iTipoDMG = IP_CONST_DAMAGETYPE_COLD; break; case 3: iTipoDMG = IP_CONST_DAMAGETYPE_ELECTRICAL; break; case 4: iTipoDMG = IP_CONST_DAMAGETYPE_FIRE; break; case 5: iTipoDMG = IP_CONST_DAMAGETYPE_SONIC; break; case 6: iTipoDMG = IP_CONST_DAMAGETYPE_MAGICAL; break; } iPoder = ItemPropertyDamageBonus(iTipoDMG, iDamageBonus); oDaga = CreateItemOnObject("dagadeaumento01",oDondeCrearla); IPRemoveAllItemProperties(oDaga, DURATION_TYPE_PERMANENT); IPRemoveAllItemProperties(oDaga, DURATION_TYPE_TEMPORARY); IPSafeAddItemProperty(oDaga, ipPoderUnico); IPSafeAddItemProperty(oDaga, iPoder); return oDaga; } //::////////////////////////////////////////////////:://////////////////////////////////////////////
Uso:
CrearDagaMagica(OBJECT_SELF, iDamageBonusDagaMagica);
o
object oDaga = CrearDagaMagica(OBJECT_SELF, iDamageBonusDagaMagica);
-Usar OBJECT_SELF si la generamos al abrir un cofre o si no poner el objeto donde se crea la daga.
-iDamageBonusDagaMagica corresponde a las constantes IP_CONST_DAMAGEBONUS_* , o sea IP_CONST_DAMAGEBONUS_1d6, IP_CONST_DAMAGEBONUS_2d8, etc...
Para activar la daga, usamos el script siguiente en OnActivateItem, poder unico:
//:://///////////////////////////////////////////// //:: TIERRA DE HEROES - dagadeaumento //:: Copyright (c) 2018 Fran Luque (Avernum). //::////////////////////////////////////////////// /* On Activate Item, transfiere la propiedad de la daga al objeto indicado -Si, tiene que ser una daga por el rollo itemproperties Para usar en conjuncion con Asbury Forge */ //::////////////////////////////////////////////// //:: Created By: Fran Luque //:: Created On: 20/10/2018 //::////////////////////////////////////////////// string ItemPropertyToString(itemproperty p) { string str = GetStringByStrRef(StringToInt(Get2DAString("itempropdef", "Name", GetItemPropertyType(p)))); string subtype_table = Get2DAString("itempropdef", "SubTypeResRef", GetItemPropertyType(p)); if (subtype_table != "") { int subtype = GetItemPropertySubType(p); string subtype_value = GetStringByStrRef(StringToInt(Get2DAString(subtype_table, "Name", subtype))); str += " (" + subtype_value + ")"; } int param1_table = GetItemPropertyParam1(p); if (param1_table > -1 && param1_table != 255) { string param1_table_name = Get2DAString("iprp_paramtable", "TableResRef", param1_table); string param1_table_value = GetStringByStrRef(StringToInt(Get2DAString(param1_table_name, "Name", GetItemPropertyParam1Value(p)))); str += ", " + param1_table_value; } int cost_table = GetItemPropertyCostTable(p); if (cost_table > 0) { string cost_table_name = Get2DAString("iprp_costtable", "Name", cost_table); string cost_table_value = GetStringByStrRef(StringToInt(Get2DAString(cost_table_name, "Name", GetItemPropertyCostTableValue(p)))); str += ": " + cost_table_value; } return str; } //::////////////////////////////////////////////// void main() { object oEventItem = GetItemActivated(); object oActTarget = GetItemActivatedTarget(); location lActTarget = GetItemActivatedTargetLocation(); object oActivator = GetItemActivator(); string sTargetName = GetName(oActTarget); //string sEventItemName = GetName(oEventItem); itemproperty ipPoderUnico = ItemPropertyCastSpell(IP_CONST_CASTSPELL_UNIQUE_POWER, IP_CONST_CASTSPELL_NUMUSES_UNLIMITED_USE); itemproperty ipGem; itemproperty ipLoop; itemproperty ipFItem; string sProps; if (!GetIsObjectValid(oActTarget)) {SendMessageToPC(oActivator, "*"+sTargetName+" no es un objeto válido*"); return; } //Esto evita un hard crash o.O if (oActTarget==oEventItem) {FloatingTextStringOnCreature("*"+sTargetName+" no es un objeto válido*", oActivator, FALSE);return;} //Quitar el efecto de la daga y pasarla al arma target, destruir daga ipLoop=GetFirstItemProperty(oEventItem); while ( GetIsItemPropertyValid(ipLoop) ) { if ( (GetItemPropertyType(ipLoop)!=GetItemPropertyType(ipPoderUnico)) ) { AddItemProperty(DURATION_TYPE_PERMANENT,ipLoop,oActTarget); sProps = ItemPropertyToString(ipLoop); FloatingTextStringOnCreature("*"+sTargetName+" ahora tiene "+sProps, oActivator, FALSE); SetName(oActTarget, sTargetName+" "+sProps); } ipLoop=GetNextItemProperty(oEventItem); } DestroyObject(oEventItem,0.5f); }
Espero que os sirva, un saludo!
Edited by Avernum, 30 May 2020 - 11:50 AM.