M_v_M

30/04/2007 16:07:27

Bueno, un nuevo reto para los scripters, que luego tendrá una solución bastante sencilla, pero yo que soy un cazurro, no la saco: (a ver si alguno se pica y me ayuda xD)

-¿Cómo haría para que un PJ al morir en un módulo, directamente NO PUEDA RESUCITAR? (MP al canto, llanamente) Pensé en el sistema de aquí, de llevarte a un área aislada, pero no me convenció demasiado...

-¿Y para que los cofres aleatorios no den nunca armas superiores a +2? ¿Se puede hacer una selección de los objetos-oro que todos los cofres dan?

Sí, no tengo ni zorra de guiones xD. Y he estado buscando y tampoco encuentro lo que busco. Si algún alma caritativa me ayuda, yo como siempre, a vuestros pies. :wink:

M_v_M

01/05/2007 12:22:14

Lo de la muerte, solucionado a lo cutre (ya decía yo que algo así era), simplemente he quitado el script por defecto de on playerdeath... El problema es que creo que si por casualidad ese módulo se reiniciara con el PJ muerto, saldría vivo de nuevo. Pero no tengo ni idea.

Así que he pensado que al morir, a ese PJ se le diera un objeto de trama, como aquí la mortalidad, y el sistema lo reconociera al entrar, y si lo tiene, llevarlo a ese Limbo tan bonito.

Pero de nuevo, no se ni por dónde empezar...Kowaaa, Althoooor *bebé berreando*

AlthorDeMalavir

01/05/2007 15:20:33

Respecto a lo de los tesoros el nwn implementa un sistema que tu pones en un area a parte unos cofres y metes hay lo que quieres que salga de tesoro en tu modulo, yo no lo uso asi que no se como funciona, tendrias que consultarlo por algun lado.

Respecto a lo de la muerte para lo que pides solo hay que quitar una funcion del script del onPlayerDeath del modulo, la funcion es la que hace que te salga la ventanita para regenerar,a parte de eso, si el tipo sale y entra volvera a estar vivo por lo que hay que añadirle como bien dices o un objeto que lo identifique como muerto o meter una variable en la base de datos para no usar objeto alguno, asi si entra de nuevo, en el script de OnplayerEnter del modulo se le detecta, se le mata y se lemanda donde quieras.

Puesto que lo de morir se parece bastante a lo que hay en mi modulo simplemente borrando alguna cosilla de lo mio se puede adaptar a lo tuyo asi que te pongo los scripts necesarios.

EL siguiente script iria en el evento OnPlayerDeath, el script hace que no salga la ventana de regeneracion y ademas coloca la variable en el pj que indica que esta muerto.

[code:1:8b60011cfa]
//::///////////////////////////////////////////////
//:: Death Script
//:: NW_O0_DEATH.NSS
//:: Copyright (c) 2001 Bioware Corp.
//:://////////////////////////////////////////////
/*
This script handles the default behavior
that occurs when a player dies.

BK: October 8 2002: Overriden for Expansion
*/
//:://////////////////////////////////////////////
//:: Created By: Brent Knowles
//:: Created On: November 6, 2001
//:://////////////////////////////////////////////
/*
void ClearAllFactionMembers(object oMember, object oPlayer)
{
// AssignCommand(oMember, SpeakString("here"));
AdjustReputation(oPlayer, oMember, 100);
SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
object oClear = GetFirstFactionMember(oMember, FALSE);
while (GetIsObjectValid(oClear) == TRUE)
{
ClearPersonalReputation(oPlayer, oClear);
oClear = GetNextFactionMember(oMember, FALSE);
}
} */
void Raise(object oPlayer)
{
effect eVisual = EffectVisualEffect(VFX_IMP_RESTORATION);

effect eBad = GetFirstEffect(oPlayer);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectResurrection(),oPlayer);
ApplyEffectToObject(DURATION_TYPE_INSTANT,EffectHeal(GetMaxHitPoints(oPlayer)), oPlayer);

//Search for negative effects
while(GetIsEffectValid(eBad))
{
if (GetEffectType(eBad) == EFFECT_TYPE_ABILITY_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_AC_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_ATTACK_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_DAMAGE_IMMUNITY_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SAVING_THROW_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SPELL_RESISTANCE_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_SKILL_DECREASE ||
GetEffectType(eBad) == EFFECT_TYPE_BLINDNESS ||
GetEffectType(eBad) == EFFECT_TYPE_DEAF ||
GetEffectType(eBad) == EFFECT_TYPE_PARALYZE ||
GetEffectType(eBad) == EFFECT_TYPE_NEGATIVELEVEL)
{
//Remove effect if it is negative.
RemoveEffect(oPlayer, eBad);
}
eBad = GetNextEffect(oPlayer);
}
//Fire cast spell at event for the specified target
SignalEvent(oPlayer, EventSpellCastAt(OBJECT_SELF, SPELL_RESTORATION, FALSE));
ApplyEffectToObject(DURATION_TYPE_INSTANT, eVisual, oPlayer);
}

void main()
{

object oPlayer = GetLastPlayerDied();
// * increment global tracking number of times that I died
SetLocalInt(oPlayer, "NW_L_PLAYER_DIED", GetLocalInt(oPlayer, "NW_L_PLAYER_DIED") + 1);

// * BK: Automation Control. Autopcs ignore death
if (GetLocalInt(oPlayer, "NW_L_AUTOMATION") == 10)
{
Raise(oPlayer);
DelayCommand(1.0, ExecuteScript("crawl", OBJECT_SELF));
return; // Raise and return
}


// * Handle Spirit of the Wood Death
string sArea = GetTag(GetArea(oPlayer));

// * make friendly to Each of the 3 common factions
AssignCommand(oPlayer, ClearAllActions());
// * Note: waiting for Sophia to make SetStandardFactionReptuation to clear all personal reputation
if (GetStandardFactionReputation(STANDARD_FACTION_COMMONER, oPlayer) <= 10)
{ SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
SetStandardFactionReputation(STANDARD_FACTION_COMMONER, 80, oPlayer);
}
if (GetStandardFactionReputation(STANDARD_FACTION_MERCHANT, oPlayer) <= 10)
{ SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
SetStandardFactionReputation(STANDARD_FACTION_MERCHANT, 80, oPlayer);
}
if (GetStandardFactionReputation(STANDARD_FACTION_DEFENDER, oPlayer) <= 10)
{ SetLocalInt(oPlayer, "NW_G_Playerhasbeenbad", 10); // * Player bad
SetStandardFactionReputation(STANDARD_FACTION_DEFENDER, 80, oPlayer);
}

//DelayCommand(2.5, PopUpGUIPanel(oPlayer,GUI_PANEL_PLAYER_DEATH));
SetCampaignInt("DB_MUERTES", "SM_PJMUERTO", 1, oPlayer);

}
[/code:1:8b60011cfa]

AlthorDeMalavir

01/05/2007 15:29:41

El siguiente script iria en el evento OnClientEnter es para si sale del juego muerto cuando vuelva a entrar siga muerto y ademas lo lleve a otro lugar, tambien funciona si se reinicia el modulo. Crea un punto de ruta con la etiqueta SM_LIMBO en el area donde quieras que termine el pj.

[code:1:21f277f7dc]
void main()
{
object oPlayer = GetEnteringObject();
object theWaypoint = GetWaypointByTag("SM_LIMBO");
AssignCommand(oPlayer, JumpToLocation(GetLocation(theWaypoint)));
effect eDeath = EffectDeath(FALSE, FALSE);
int iVarMuerte = GetCampaignInt("DB_MUERTES", "SM_PJMUERTO", oPlayer);
if(iVarMuerte == 1) DelayCommand(1.0, ApplyEffectToObject(DURATION_TYPE_INSTANT, eDeath, oPlayer));
}
[/code:1:21f277f7dc]

M_v_M

01/05/2007 15:33:31

De nuevo me toca quitarme el sombrero xD. Lo pongo y a ver como va la cosa... Por cierto, también funciona si el server se cuelga/reinicia?

AlthorDeMalavir

01/05/2007 15:38:36

he modificado el script asi qu ecopialo bien, si fun ciona si reinicia.

AlthorDeMalavir

01/05/2007 15:40:27

nuevo edicion, hyabia un error xD, no esperaba que lo viese tan pronto.

M_v_M

01/05/2007 15:47:53

Paren las máquinas!! xD Al final me vuelves loco :P Vuelvo a copiar y pegar, mister.

M_v_M

01/05/2007 15:50:58

Otra cosilla... Se supone que el PJ muere, y se queda en el sitio, sin que aparezca la ventanita de opciones, por lo tanto, sin poder regenerar por su cuenta, sólamente mediante el uso de un clérigo...

Tengo pensado que si viene un clérigo y lo resucita, el PJ muerto pierda un nivel inmediatamente (más o menos, hacerlo lo más fiel a mesa posible), o ninguno, según el conjuro de resurrección usado...

Sería esto posible?

*Se disculpa de antemano por ser tan plasta*

AlthorDeMalavir

01/05/2007 16:10:14

Si, eso es posible, seria cuastion de modificar los scripts de los conjuros de revivir a los muertos y resureccion para que al usarlos sobre un pj le quite la experiencia o niveles oportunos.

Deberias intentar conseguir un programador yo no puedo hacerte los scripts de tu modulo xD, sobre todo sino los tengo yo ya hechos o si a mi me sirven depoco lo que tu pretendas hacer en tu modulo, yo te ayudare en lo que buenamente pueda, esto de la experiancia me supone una inversion de tiempo que no es que disponga y a mi modulo no le sirve de nada :P

M_v_M

01/05/2007 16:25:59

Lo de que necesito un programador empieza a ser evidente cada vez más xDDD.

Bueno, me pondré a toquitear, a ver que saco (aparte de tener que reinstalar el juego porque me cargue algo).

Gracias por lo del sistema de muertes!

M_v_M

08/05/2007 20:34:55

Lo he estado probando y algo falla, no sé qué es :? El caso es que si un PJ muere, vale, no sale la pantalla de resurrección, pero al salir y entrar al servidor de nuevo, no se va al punto de ruta SM_LIMBO.

Y si se le resucita, sale y vuelve a entrar, entra muerto :?

AlthorDeMalavir

08/05/2007 22:31:36

Cierto, el primer error es debido a que priemro hay que revivir al pj antes de mandarlo al limbo y una vez alli volverlo a matar para evitar que salga entonces y espere un reinicio.

El segundo error se debe a que falta un script en el OnHeartbeat del modulo que verifique que el pj ha sido resucitado y por tanto elimine la variable que guarda que habia muerto.

Son detalles que se escapan cuando lo programas pero no lo pruebas :P

Mañana te lo miro y lo termino.

M_v_M

08/05/2007 22:44:37

Si llego a terminarlo y colgarlo, te hago una estatua o algo (ubicado, digo :P )

kowalevskaya

09/05/2007 10:08:45

[quote:c2fc64eb7f="M_v_M"]Lo he estado probando y algo falla, no sé qué es :? El caso es que si un PJ muere, vale, no sale la pantalla de resurrección, pero al salir y entrar al servidor de nuevo, no se va al punto de ruta SM_LIMBO.[/quote:c2fc64eb7f]
Yo lo tengo hecho, poniéndole una calavera de trama y al entrar, si el PJ tiene la susodicha calavera, se bota al limbo.

Lo que comentas que quieres hacer, viene en las HCR2 (Hard Core Rules 2).
Si se te da bien el inglés, podrás largar al personaje al limbo dejando en su ubicación de muerte un "gonito" cuerpo con parte (o todas) sus pertenencias.
[list:c2fc64eb7f]http://nwvault.ign.com/View.php?view=Scripts.Detail&id=701[/list:u:c2fc64eb7f]

M_v_M

09/05/2007 22:33:49

Bueno, de aquí lo mismo puedo sacar algo :D Gracias de nuevo, Kowa... Esperando a Althor me quedo xD.

kowalevskaya

10/05/2007 00:00:40

Ná... lo que sí, si me permites el consejo... mírate bien todo lo de las HCR2, porque despiezar los sistemas de scripts que aparecen, es un verdadero #oñazo... y la verdad está muy completo y es configurable... eso sí, todo en la lengua de Shakespeare.

M_v_M

12/05/2007 13:51:06

Althooor *eco* :P

AlthorDeMalavir

12/05/2007 22:00:48

ando algo liado haber si mañana puedo.

M_v_M

22/05/2007 16:35:47

Mañana de que día? xD.

AlthorDeMalavir

23/05/2007 13:54:01

Aqui el script que se ha de colo car en el OnHeartBeat del modulo par que si los resucitan pues que no entren muertos la siguiente vez, lo que hace es poner a cero la variable que inquica que murio.

[code:1:f9c72297d2]
void main()
{
//Saltar si ya hay una rutina de latido en progreso
if ((GetLocalInt(GetModule(), "LATIDO_EN_PROGRESO") != 1))
{
SetLocalInt(GetModule(), "LATIDO_EN_PROGRESO", 1);//Bloqueo de la rutina

object oPC = GetFirstPC();

while (GetIsObjectValid(oPC))
{
//Sistema para evitar que salgan muertos y entren vivos.
int iPJFallecido = GetCampaignInt("DB_MUERTES", "SM_PJMUERTO", oPC);
if(GetCurrentHitPoints(oPC) > 0 && iPJFallecido == 1)
{
SetCampaignInt("DB_MUERTES", "SM_PJMUERTO", 0, oPC);
}

oPC = GetNextPC();
}
SetLocalInt(GetModule(), "LATIDO_EN_PROGRESO", 0);//Activado del latido
}
}
[/code:1:f9c72297d2]

AlthorDeMalavir

23/05/2007 14:00:39

El error de que sale y vuelve a entrar y no va al limbo no lo veo claro, deberia funcionar, tal vez no le de tiempo a llevar al PJ antes de matarlo, rueba a subir el tiempo del DelayCommand en el script del evento OnclienEnter, ponlo en 5.0 o algo asi.

M_v_M

04/06/2007 16:46:01

Cuando el curro y el mapeo me deje algo de tiempo libre lo toquiteo. Mil gracias, Althor y Kowa :D

Nefutari

07/06/2007 14:08:05

Yo el HCR no te lo recomiendo para dejar monigotes, a menos que quieras tirarte un buen rato con el raton para encontrarlo, solo funciona bien si dejas activado que pierdan todo su inventario.

Es una putada todo el inventario, y al desactivarlo te crea un monigote utilizable, y una zona pequeña, sobre la zona de la cabeza que es la que se debe pinchar para poder coger el cuerpo, una jodienda en toda regla, solo por ayduar meto unas aclaraciones que hicieron en otro foro de scripters para este sistema, por si aun asi quieres utilizarlo.

[code:1:06ee1b44fc]
PWEXP: Cambia las opciones de experiencia, por defecto 0, si lo cambiamos llevara la exp de un mundo persistente
GHOSTSYSTEM: Cambiarlo si quereis que al morir podais recuperar vuestro cuerpo en forma de fantasma
MATERCOMP: Cambiadlo si teneis el addon de habilidades nuevas
SINGLECHARACTER: Cambiadlo si quereis que los jugadores tengan solo un PJ
LOGINMESSAGE: Mensaje de bienvenida del server
DEATHOVERREBOOT: Para desconectar si estas muerto y salvarte de la muerte.. no lo cambieis
SUMMONTIME: COn 1 los bichos invocados no duraran mas que lo que tengais de level, 0 invocaion por defecto de nwn
REALFAM: Da de comer al familiar y no se recupera del todo
HCRTRAPS: necesitas tiradas de busqueda para encontrar trampas
LEVELTRAINER: Con 1 se requieren entrenadores para subir de nivel
LEVELCOST: EL pj empieza con tal exp
GIVELEVEL: DA el nivel al PJ
DMRESERVE: deja un hueco al DM en partidas online, o dos, o tres...
PKTRACKER: busca asesions PK de jugadores, por defecto si matas a 5 te exhan del serv al 6
TELLONPK: con 1 todos se enteran de que hubo un asesinato
WANDERSYSTEM: con 1 hay una probabilidad mientras descansas de que aparezca un monstruo atacandote, por defecto no aparecen
GODSYSTEM: COn 1 puedes rezar a tu dios y volver a la vida
DEATHSYSTEM: en 0 volveremos al sistema basico de morir de nwn (sucks)
BLEEDSYSTEM: metodo de desangrarse de HCR, a 0 hp te quedas tonto y con numero negativos comienzas a morir
LOOTSYSTEM: COn 1 cualquiera puede robar las pertenencias de tu cuerpo muerto (esto jode mucho)
REZCHANCE: en %, suerte de que tu dios te resucite
REZPENALTY: con 1 al morir pierdes medio nivel
LIMBO: con 1 al morir vamos al limbo, donde podemos rezar y volver a la vida, con 0 jeje, ahi te quedas en el camino
RESTSYSTEM: con 1 necesitareis estar tranquilos para descansar, tener la panza llena y las horas de rigor
RESTBREAK: tiempo entre descanso y descanso (en horas NWN)
RESTARMORPEN: penalizacion al descansar por armaduras gordas
LIMITEDRESTHEAL: con 1 nunca recuperaremos toda la vida al descansar. (n del autor: si lo ponemos a 0 para que estan los clerigos entonces?)
BEDROLLSYSTEM: Se necesita un saco de dormir para el descanso
STORESYSTEM: le da un poco mas de facilidad a los personajes nuevos con respecto a la armadura y compra de objetos
FOODSYSTEM: Se necesita comida para descansar
BURNTOUCH: Con 1, las antorchas duraran 1 hora de vida, a 0 seran imperecederas
HUNGERSYSTEM: CON 1, necesitas comida y agua para no morirte de hambre por el camino
FATIGUESYSTEM: COn 1, un personaje puede sentirse mal si no descansa lo adecuado
HCREXP: Aplica la exp real del HCR, en 0 la deja como antes
BASEEXP: regula esto para saber lo que recibe un jugador por experiencia al matar bichos, de ti depende poner la velocidad de tu modulo, ponlo bajo si quieres que sea mu mu chungo
BONUSEXP: lo mismo de lo mismo, bonus de experiencia, mas grande, mas rapido subes de nivel
HCREAD: Ponlo a 1 y go!
[/code:1:06ee1b44fc]

Por si aun asi te sirve de algo, yo lo di por imposible, lo del cuerpo.