Ninfablanca

28/12/2005 15:58:02

Veamos, he creado una subraza (simples vampiros) y se supone que cuando estan expuestos a la luz del sol (como los drows más o menos) tiene que salir ardiendo (para esto quiero hacerle 1d6 daños divinos repetidas veces hasta que salga del area) Bueno, que más os puedo decir, todos sabemos lo que es un vampiro, así que lo más normal es que si se expone a la luz del sol se muera en pocos asaltos.

Aqui pongo mi script para hacer la subraza situado en el OnClientEnter:

//Subraza Vampira
if ((sSubRaza == "Vampiro"))
{
//Si en el inventario del personaje ya habia objetos raciales, se los quita//
object oPiel= GetItemInSlot(INVENTORY_SLOT_CARMOUR,oJugador);
DestroyObject(oPiel);
//Aqui ya ha terminado de quitarle todo
object oPielVampiro = CreateItemOnObject("piel_vampiro", oJugador,1);//Te da la piel de los vampiros.
AssignCommand(oJugador, ActionEquipItem(oPielVampiro, INVENTORY_SLOT_CARMOUR));
SendMessageToPC(oJugador,"Se te ha otorgado el don de los vampiros, condenados a la eterna oscuridad.");
}
//Fin de subraza.

Si alguien save como hacerlo por favor, sed misericordiosos XD.

Ninfablanca

30/12/2005 17:01:36

ju, debe ser complicado o largo porque nadie me cnt jaja

mviper

30/12/2005 17:24:22

Io esque de momento no me he metido a hacer subrazas, siempre me parecieron algo secundario... por tanto no creo poder ayudarte con esto.

Ninfablanca

30/12/2005 21:13:05

Bueno, no pasa na, en si hacerlas es facil, pero no se como se detectan las zonas al aire libre y eso, así que miraré por ahí en algún sistema a ver si veo drows.

31/12/2005 01:21:11

Hay tienes una funcion que me cree yo para hacer lo de los drows, que s equeden ciegos al sol, espero que te sirva de algo, al menos la parte que mira si esta fuera al sol

[code:1:c33672814f]
//******************************************************************************
//* SSP_LatidoSistema
//******************************************************************************
void SSP_LatidoSistema(object oPC)
{

if(GetIsDM(oPC)) return;

object oArea = GetArea(oPC);
string sSubraza = GetStringLowerCase(GetSubRace(oPC));

if (sSubraza == "drow" || sSubraza == "duergar")
{
if(GetIsDay() == TRUE )
{
if(GetIsAreaAboveGround(oArea) == AREA_ABOVEGROUND &&
(GetIsAreaNatural(oArea) == AREA_NATURAL ||
GetIsAreaNatural(oArea) == AREA_ARTIFICIAL) &&
!GetIsAreaInterior(oArea))
{
//El Drow se encuentra bajo la luz del sol
SSP_AplicarPenalizadores(oPC);
SSP_ContarSalidasSup(oPC);
SetLocalInt(oPC, "SalidaSuperficie", 1);
}
}
else if(GetIsNight() == TRUE)
{
if(GetIsAreaAboveGround(oArea) == AREA_ABOVEGROUND &&
(GetIsAreaNatural(oArea) == AREA_NATURAL ||
GetIsAreaNatural(oArea) == AREA_ARTIFICIAL) &&
!GetIsAreaInterior(oArea))
{
//El Drow se encuentra en exteriores pero es de noche
SSP_QuitarPenalizadores(oPC);
SetLocalInt(oPC, "SalidaSuperficie", 0);
}
}
if(GetIsAreaAboveGround(oArea) == AREA_UNDERGROUND &&
(GetIsAreaNatural(oArea) == AREA_NATURAL ||
GetIsAreaNatural(oArea) == AREA_ARTIFICIAL) &&
GetIsAreaInterior(oArea))
{
//El Drow se encuentra en la oscuridad
SSP_QuitarPenalizadores(oPC);
}
}
}
[/code:1:c33672814f]

31/12/2005 01:24:15

Por cierto, lo ahs deponer en el OnHeartBeat del modulo, para que mire cada PJ, si es vampiro y si esta bajo el sol, el heartbeat se ejecuta aproximadamente cada 6 segundos, asi que puedes hacer que cada heartbeat les hada el daño divino ese.

Bueno te dejo el script tambien del heartbeat de mi modulo, asi te ayudara un poco mas a revisar cada pj y a que no se ejecute infinitas veces que es uno de los problemas que puede dar.

[code:1:7d0e99564f]
#include "sistemas_ro_cfg"
#include "ssp_inc"
#include "sop_inc"
#include "scb_inc"

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();
int iVidaPJ;

//solucion al mal funcionamiento del reloj k marca los ciclos dia/noche
int iHoraActual = GetTimeHour();
int iMinutoActual = GetTimeMinute();
int iSegundoActual = GetTimeSecond();
int iMilisActual = GetTimeMillisecond();
int iHoraGuardada = GetLocalInt(GetModule(), "HoraGuardada");

if (iHoraActual != iHoraGuardada)
{
//SendMessageToPC(oPC, "***Actualizando el reloj del juego***");
SetTime(iHoraActual, iMinutoActual, iSegundoActual, iMilisActual+100);
SetLocalInt(GetModule(), "HoraGuardada", iHoraActual);
}
//fin de la correcion


while (GetIsObjectValid(oPC))
{
//Sistema para evitar que salgan muertos y entren vivos.
object oMuerte = OBJECT_INVALID;
if(GetCurrentHitPoints(oPC) > 0)
{
oMuerte = GetItemPossessedBy(oPC, "Muerte");
if(GetIsObjectValid(oMuerte)) DestroyObject(oMuerte);
}

//Latido del Sistema de Subrazas por Pieles (SSP)
SSP_LatidoSistema(oPC);

//Latido del Sistema de Oficios por propiedades (SOP)
SOP_LatidoSistema(oPC);

//Sistema de comida y bebida
SCB_LatidoSistema(oPC);

// Sistema de persistencia de Sangre
if(!GetIsDM(oPC))
{
iVidaPJ = GetCurrentHitPoints(oPC);
SetLocalInt(oPC, "sangrepj", iVidaPJ);
}

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

Ninfablanca

31/12/2005 03:39:40

Muchisimas gracias Althor, es fácil que me sirva, ya que con eso me das las bases y lo que yo pido es más sencillo realmente, porque no se les aplica penalizadores o bonificaciones sino que si es de día y estan fuera se les hace el daño y ya ta. Ahora que sepa aplicarlo ya es otra historia jaja ^^

Ninfablanca

31/12/2005 05:41:46

Juaps, me pierdo, lo de arriba del todo he de ponerlo en el OnHeartBeat? De ser así, donde lo situas respecto a la función de abajo (el void main).
Por otro lado creo que cojo lo que necesito expresamente, que es la condicion de que este de día.

Ninfablanca

31/12/2005 06:10:36

Puede ser algo así? Esque realmente aqui me pierdo totalmente, además con las horas que son ya no rigo bien (si esque algún día lo hice)

void SSP_LatidoSistema(object oPC)
{

if(GetIsDM(oPC)) return;

object oArea = GetArea(oPC);
string sSubraza = GetStringLowerCase(GetSubRace(oPC));

if (sSubraza == "Vampiro")
{
if(GetIsDay() == TRUE )
{
if(GetIsAreaAboveGround(oArea) == AREA_ABOVEGROUND &&
(GetIsAreaNatural(oArea) == AREA_NATURAL ||
GetIsAreaNatural(oArea) == AREA_ARTIFICIAL) &&
!GetIsAreaInterior(oArea))
{
//El Vampiro se encuentra bajo la luz del sol
effect eDamage = EffectDamage( 10, DAMAGE_TYPE_DIVINE, DAMAGE_POWER_ENERGY );
ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, OBJECT_SELF);

}
}

}
}

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))
{
//Latido del Sistema de Subrazas por Pieles (Para el dammage de los vampiros)
SSP_LatidoSistema(oPC);
}
SetLocalInt(GetModule(), "LATIDO_EN_PROGRESO", 0);//Activado del latido
}
}

31/12/2005 12:06:22

Parece correcto lo unico que despues de

//Latido del Sistema de Subrazas por Pieles (Para el dammage de los vampiros)
SSP_LatidoSistema(oPC);


tienes que poner

oPC = GetNextPC();

sino te hace un bucle infinito y da el tipico error de demasiadas instrucciones.

Ninfablanca

31/12/2005 14:38:36

Nuse, le agrego eso pero sigue sin tener ningún efecto, he comprobado la denominación de la subraza y eso y esta perfectamente, tendré que darle vueltas a ver que es lo que esta mal.

31/12/2005 15:12:22

ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, OBJECT_SELF);


deberia ser

ApplyEffectToObject(DURATION_TYPE_INSTANT, eDamage, oPC);


Para hacerso al jugador y no al modulo xD

Ninfablanca

31/12/2005 16:27:40

Vale, probé con eso y de iwal modo no funcionaba, pero he redefinido la string que encuentra la subraza de esta forma y ahora funciona:

[code:1:f53d4c930d]string sSubRaza = GetSubRace(oPC);[/code:1:f53d4c930d]

01/01/2006 23:20:51

ah, claro XDDD

string sSubraza = GetStringLowerCase(GetSubRace(oPC));

if (sSubraza == "Vampiro")

tenemos esto....uso la funcion GetStringLowerCase para que de igual como lo escriban siempre toma todo en minusculas, pero despues en

if (sSubraza == "Vampiro")

hay que ponerlo en minusculas sino nunca entra en el if

if (sSubraza == "vampiro")

Ninfablanca

01/01/2006 23:47:59

Ahmm... eso yo no lo sabía jeje, bueno, en ese caso lo volveré a poner del otro modo y reemplazaré también la del onenter, para que de lo mismo como lo scriban a la hora de elegir la subraza.