Saludos!!! ¿Es posible que al equiparse un PJ con: por ejemplo, una espada, este no pueda quitarla de la mano de su personaje. Obligandole asi a llevar ese arma hasta que se muera o se la quite mediante script?.
Weno esto lo mejor seria k lo hicieras con los eventos del modulo OnPlayerEquipItem y OnPlayerUnEquipItem.
Sobre todo has de tener cuidado a la hora de k el script reconozca el objeto, quiero decir, haz uno nuevo en la paleta, con una resref o tag unica, pork sino despues es posible k el script se confunda de objeto.
Tambien podrias, a la hora de crearlo, setearle una variable local al objeto, y usarla despues pa saber k es ese objeto k kieres k el pj no pueda soltar. Cualkiera de las dos te funcionará.
En cuanto al script en sí, tambien depende si lo kieres pa un servidor persistente o pa un modulo normal. Un poco mas de informacion de lo k kieres exactamente no vendría mal
El script es para un modulo individual. Queria hacer que un personaje necesitase llevar una espada y una armadura obligatoriamente en una zona del mod.
Supuse que tendria que ser algun script en lo de adquirir o soltar objetos de las propiedades del modulo, pero no se que funciones tengo que usar ni nada de nada.
Weno entonces tenemos un problemilla, pork deberías cerciorarte de que el pj realmente ha conseguido el objeto ANTES de dejarle entrar al area en cuestión ¿Como hacer esto? Pues muy facil, dependiendo de si se entra en el area por una puerta o con un trigger(desencadenante).
Si es una puerta, te vas al onOpen(click derecho en la puerta, propiedades, pestaña guiones y click en el boton “editar” del evento onOpen) y ahi le pones:
[code:1:3b510229b9]
void main()
{
object oPJ = GetLastOpenedBy();
object oObject = GetItemPossessedBy(oPJ, "TagDelItemEnCuestion");
Si es un trigger, te vas al evento onEnter del trigger y el pones:
[code:1:3b510229b9]
void main()
{
object oPJ = GetEnteringObject();
object oObject = GetItemPossessedBy(oPJ, "TagDelItemEnCuestion");
Simplemente sustituye donde dice “TagDelItemEnCuestion”, por el tag del item que quieres que lleve ekipado una vez el pj esté en el area, y si utilizas un trigger, sabrás que hay que hacerlo poniendo un waypoint en el lugar en el k kieres que el pj aparezca, coloca el tag de dicho waypoint donde dice “TagDelWaypointDelSiguienteArea”.
Bien, ahora la forma mas segura que yo veo de que el pj no se pueda desekipar el item es la siguiente:
En el OnEnter del area en cuestión le pones que se equipe el item:
[code:1:3b510229b9]
void main()
{
object oPJ = GetEnteringObject();
object oItem = GetObjectByTag("TagDelItemEnCuestion");
//Obligamos al pj a que cuando entre en el area, tenga ekipado el item
//porque antes de entrar en el area, comprobamos que realmente lo tenia encima
AssignCommand(oPJ, ActionEquipItem(oItem, CONSTANTE_SLOT)); } [/code:1:3b510229b9]
Ahora en el evento del modulo OnPlayerUnEquipItem le pones que compruebe si el item k el pj se esta desekipando es el k nos interesa, y si efectivamente lo es, se lo volvemos a equipar:
[code:1:3b510229b9]
void main()
{
object oPJ = GetPCItemLastUnequippedBy();
object oItem = GetPCItemLastUnequipped();
object oArea = GetArea(oPJ);
Fijate donde he puesto CONSTANTE_SLOT. En el nwscript existe una constante por cada slot del equipo de un personaje, es decir, existe una para donde pones la armadura, otra pa onde pones las capas, orta pa onde pones el arma derecha,… Como no nos has dicho nada del item, pues lo he dejado asi, y tu pones la correcta. Para ver las constantes te vas al lexicon o al mismo filtro de funciones del editor de guiones del toolset, y pon INVENTORY_SLOT_ , te saldrán todas las constantes, sabiendo un pizco de ingles o con un diccionario delante, no tendras problema en saber cual es la correcta
Con todo esto no consigues que el pj no pueda desequiparse el item, cosa que por lo que yo se, es imposible. Simplemente lo k hacemos es, si el pj se lo desequipa y está en el area en la que tu kieres k no se lo ki
Hola Viko mira yo lo que tengo aquí para ofrecerte es un scrip de un anillo maldito que no se deja quitar y si lo intentas te pone un mensajito, yo por lo que entiendo es el primero es que ya estoy aprendiendo a leer un poco esto , el segúndo es el anillo en cuestión por si lo quieres o he metido la pata lo cual es muy posible jejeje.
Espero que te haya ayudado J
void main()
{
object oPC=OBJECT_SELF;
object oItem=GetItemPossessedBy(oPC,”ringoftheghost”);
if(GetItemCursedFlag(oItem)==FALSE)
{
AssignCommand(oPC,ActionUnequipItem(oItem));
SendMessageToPC(oPC,”The ring on your finger shifts a little too much towards the etheral plane and drops off your finger.”);
}
}
#include “x2_inc_switches”
void main()
{
object oPC;
object oItem;
int nEvent=GetUserDefinedItemEventNumber();
if(nEvent==X2_ITEM_EVENT_EQUIP)
{
oPC=GetPCItemLastEquippedBy();
oItem=GetPCItemLastEquipped();
int iChance=d100();
if(GetItemCursedFlag(oItem)==FALSE)
{
if(iChance>=40)
{
effect eCurse=SupernaturalEffect(EffectCurse(10,2,6,0,0,0));
vector vPCVector=GetPosition(oPC);
float fPCFacing=GetFacing(oPC);
float fAngleToMove;
if(fPCFacing<=180.0)fAngleToMove=fPCFacing+180.0;
else fAngleToMove=fPCFacing-180.0;
float fDistanceBehind=3.0;
vector vFinalVector;
vFinalVector.z=vPCVector.z;
vFinalVector.x=vPCVector.x+(fDistanceBehindcos(fAngleToMove));
vFinalVector.y=vPCVector.y+(fDistanceBehindsin(fAngleToMove));
location lLocation=Location(GetArea(oPC), vFinalVector, fPCFacing);
object oInvisObj=CreateObject(OBJECT_TYPE_PLACEABLE,”plc_invisobj”,lLocation);
SetItemCursedFlag(oItem,TRUE);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eCurse,oPC);
AssignCommand(oInvisObj,ActionCastFakeSpellAtObject(SPELL_PHANTASMAL_KILLER,oPC));
SendMessageToPC(oPC,”The second after you put the ring on, it feels ice cold to the touch and drains your physical strength greatly.”);
}
else
{
float fTimeEquip=(HoursToSeconds(GetTimeHour()+1)-HoursToSeconds(GetTimeHour()))*(d4()+2);
DelayCommand(fTimeEquip,ExecuteScript(“ghostringunequip”,oPC));
}
}
}
if(nEvent==X2_ITEM_EVENT_UNEQUIP)
{
oPC=GetPCItemLastUnequippedBy();
oItem=GetPCItemLastUnequipped();
if(GetItemCursedFlag(oItem)==TRUE)
{
int iInvSlot;
if(!GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTRING)))iInvSlot=INVENTORY_SLOT_LEFTRING;
else iInvSlot=INVENTORY_SLOT_RIGHTRING;
AssignCommand(oPC,ActionEquipItem(oItem,iInvSlot));
SendMessageToPC(oPC,”The ring just doesn’t seem to get off. It’s stuck.”);
}
}
}
Siiiiiiiiiiiiiiiiiiiiiii
Lo que no te puedo decir, de memoria, es como se hace, pero tiempo al tiempo…
Saludos!!!
Pos mira a ver si me puedes ayudarme con eso que me vendria de perlas para el modulo(cuando puedas claro
).
Weno esto lo mejor seria k lo hicieras con los eventos del modulo OnPlayerEquipItem y OnPlayerUnEquipItem.
Sobre todo has de tener cuidado a la hora de k el script reconozca el objeto, quiero decir, haz uno nuevo en la paleta, con una resref o tag unica, pork sino despues es posible k el script se confunda de objeto.
Tambien podrias, a la hora de crearlo, setearle una variable local al objeto, y usarla despues pa saber k es ese objeto k kieres k el pj no pueda soltar. Cualkiera de las dos te funcionará.
En cuanto al script en sí, tambien depende si lo kieres pa un servidor persistente o pa un modulo normal. Un poco mas de informacion de lo k kieres exactamente no vendría mal
Saludos.
Saludos!!!
El script es para un modulo individual. Queria hacer que un personaje necesitase llevar una espada y una armadura obligatoriamente en una zona del mod.

Supuse que tendria que ser algun script en lo de adquirir o soltar objetos de las propiedades del modulo, pero no se que funciones tengo que usar ni nada de nada.
Weno entonces tenemos un problemilla, pork deberías cerciorarte de que el pj realmente ha conseguido el objeto ANTES de dejarle entrar al area en cuestión ¿Como hacer esto? Pues muy facil, dependiendo de si se entra en el area por una puerta o con un trigger(desencadenante).
Si es una puerta, te vas al onOpen(click derecho en la puerta, propiedades, pestaña guiones y click en el boton “editar” del evento onOpen) y ahi le pones:
[code:1:3b510229b9]
void main()
{
object oPJ = GetLastOpenedBy();
object oObject = GetItemPossessedBy(oPJ, "TagDelItemEnCuestion");
Si es un trigger, te vas al evento onEnter del trigger y el pones:
[code:1:3b510229b9]
void main()
{
object oPJ = GetEnteringObject();
object oObject = GetItemPossessedBy(oPJ, "TagDelItemEnCuestion");
Simplemente sustituye donde dice “TagDelItemEnCuestion”, por el tag del item que quieres que lleve ekipado una vez el pj esté en el area, y si utilizas un trigger, sabrás que hay que hacerlo poniendo un waypoint en el lugar en el k kieres que el pj aparezca, coloca el tag de dicho waypoint donde dice “TagDelWaypointDelSiguienteArea”.
Bien, ahora la forma mas segura que yo veo de que el pj no se pueda desekipar el item es la siguiente:
En el OnEnter del area en cuestión le pones que se equipe el item:
[code:1:3b510229b9]
void main()
{
object oPJ = GetEnteringObject();
object oItem = GetObjectByTag("TagDelItemEnCuestion");
Ahora en el evento del modulo OnPlayerUnEquipItem le pones que compruebe si el item k el pj se esta desekipando es el k nos interesa, y si efectivamente lo es, se lo volvemos a equipar:
[code:1:3b510229b9]
void main()
{
object oPJ = GetPCItemLastUnequippedBy();
object oItem = GetPCItemLastUnequipped();
object oArea = GetArea(oPJ);
Fijate donde he puesto CONSTANTE_SLOT. En el nwscript existe una constante por cada slot del equipo de un personaje, es decir, existe una para donde pones la armadura, otra pa onde pones las capas, orta pa onde pones el arma derecha,… Como no nos has dicho nada del item, pues lo he dejado asi, y tu pones la correcta. Para ver las constantes te vas al lexicon o al mismo filtro de funciones del editor de guiones del toolset, y pon INVENTORY_SLOT_ , te saldrán todas las constantes, sabiendo un pizco de ingles o con un diccionario delante, no tendras problema en saber cual es la correcta
Con todo esto no consigues que el pj no pueda desequiparse el item, cosa que por lo que yo se, es imposible. Simplemente lo k hacemos es, si el pj se lo desequipa y está en el area en la que tu kieres k no se lo ki
Saludos!!!
Muchas gracias nox, me has ayudado mas de lo que esperaba. Comprobare el script en cuanto pueda y ya te digo que tal va.
Gracias de nuevo.
Hola Viko mira yo lo que tengo aquí para ofrecerte es un scrip de un anillo maldito que no se deja quitar y si lo intentas te pone un mensajito, yo por lo que entiendo es el primero es que ya estoy aprendiendo a leer un poco esto
, el segúndo es el anillo en cuestión por si lo quieres o he metido la pata lo cual es muy posible jejeje.
Espero que te haya ayudado J
void main()
{
object oPC=OBJECT_SELF;
object oItem=GetItemPossessedBy(oPC,”ringoftheghost”);
if(GetItemCursedFlag(oItem)==FALSE)
{
AssignCommand(oPC,ActionUnequipItem(oItem));
SendMessageToPC(oPC,”The ring on your finger shifts a little too much towards the etheral plane and drops off your finger.”);
}
}
#include “x2_inc_switches”
void main()
{
object oPC;
object oItem;
int nEvent=GetUserDefinedItemEventNumber();
if(nEvent==X2_ITEM_EVENT_EQUIP)
{
oPC=GetPCItemLastEquippedBy();
oItem=GetPCItemLastEquipped();
int iChance=d100();
if(GetItemCursedFlag(oItem)==FALSE)
{
if(iChance>=40)
{
effect eCurse=SupernaturalEffect(EffectCurse(10,2,6,0,0,0));
vector vPCVector=GetPosition(oPC);
float fPCFacing=GetFacing(oPC);
float fAngleToMove;
if(fPCFacing<=180.0)fAngleToMove=fPCFacing+180.0;
else fAngleToMove=fPCFacing-180.0;
float fDistanceBehind=3.0;
vector vFinalVector;
vFinalVector.z=vPCVector.z;
vFinalVector.x=vPCVector.x+(fDistanceBehindcos(fAngleToMove));
vFinalVector.y=vPCVector.y+(fDistanceBehindsin(fAngleToMove));
location lLocation=Location(GetArea(oPC), vFinalVector, fPCFacing);
object oInvisObj=CreateObject(OBJECT_TYPE_PLACEABLE,”plc_invisobj”,lLocation);
SetItemCursedFlag(oItem,TRUE);
ApplyEffectToObject(DURATION_TYPE_PERMANENT,eCurse,oPC);
AssignCommand(oInvisObj,ActionCastFakeSpellAtObject(SPELL_PHANTASMAL_KILLER,oPC));
SendMessageToPC(oPC,”The second after you put the ring on, it feels ice cold to the touch and drains your physical strength greatly.”);
}
else
{
float fTimeEquip=(HoursToSeconds(GetTimeHour()+1)-HoursToSeconds(GetTimeHour()))*(d4()+2);
DelayCommand(fTimeEquip,ExecuteScript(“ghostringunequip”,oPC));
}
}
}
if(nEvent==X2_ITEM_EVENT_UNEQUIP)
{
oPC=GetPCItemLastUnequippedBy();
oItem=GetPCItemLastUnequipped();
if(GetItemCursedFlag(oItem)==TRUE)
{
int iInvSlot;
if(!GetIsObjectValid(GetItemInSlot(INVENTORY_SLOT_LEFTRING)))iInvSlot=INVENTORY_SLOT_LEFTRING;
else iInvSlot=INVENTORY_SLOT_RIGHTRING;
AssignCommand(oPC,ActionEquipItem(oItem,iInvSlot));
SendMessageToPC(oPC,”The ring just doesn’t seem to get off. It’s stuck.”);
}
}
}
Copy & paste powa!!