Saltar al contenido

Más en DLAN: Nuestras Traducciones | Otras Traducciones | Mods y modding | Revisiones y Guías | Videojuegos | Arte | Literatura | Rol y Rol por foro e IRC | Mapa de la web
Foto

Limpieza de Area Inteligente


33 respuestas al tema

#1 Xiulito

Xiulito

    Neonato

  • Miembro
  • PipPip
  • 168 posts

Posteado 28 January 2009 - 07:33 PM

Dos scripts que limpiaran nuestras áreas de objetos, efectos, bolsas de cadáveres y bichos, ¿que hace a este sistema inteligente?, pues facil, tiene un retardo de X tiempo para hacer la limpieza, esto es por si cuando el PJ sale del área y se acuerda de que dejó el objeto equivocado pues si se da prisa puede volver antes de que se destruya, otra cosa que tiene es que solo destruye las criaturas hostiles por lo que puedes ponerlo en un área de una ciudad por si se cuelan orcos y no tener miedo a que este script aniquile todos tus guardias, una cosa que tenemos que tener en cuenta es que para la destrucción de bolsas de cadáveres el sistema que he utilizado es el de destruir primero el inventario de todo objeto en el área y ya de por si desaparece la bolsa automáticamente, esto significa que si colocas cofres en un área donde pongas este script pues se limpiara también por lo tanto tendrás que colocar la etiqueta del cofre en cuestión en el apartado señalado para que no se vea afectado.

El primer script no hace falta que lo coloques en ninguna parte, es suficiente con tenerlo creado.
Nombre: rrc_limpiar
int SiPC()
{
object oPC = GetFirstObjectInArea();
while(GetIsObjectValid(oPC))
	{
	if(GetIsPC(oPC))
		{
		return TRUE;
		break;
		}
	oPC = GetNextObjectInArea();
	}
return FALSE;
}
void main()
{
float fD = 0.1;

if (SiPC()==TRUE)return;

//============================================================================\\
//----------------------- # Limpia los Bichos # ------------------------------\\
//============================================================================\\

object oBicho = GetFirstObjectInArea();
while (GetIsObjectValid(oBicho) == TRUE)
	{
	if(GetObjectType(oBicho)==OBJECT_TYPE_CREATURE)
		{
		int iHostil = GetStandardFactionReputation(STANDARD_FACTION_HOSTILE, oBicho);

		if (iHostil)
			{
			DelayCommand(fD, DestroyObject(oBicho));
			fD=fD+0.1;
			}
		}
	oBicho = GetNextObjectInArea();
	}

//============================================================================\\
//---------------------- # Limpia los Encuentros # ---------------------------\\
//============================================================================\\

object oEncuentro = GetFirstObjectInArea();
while (GetIsObjectValid(oEncuentro) == TRUE)
	{
	if(GetObjectType(oEncuentro)==OBJECT_TYPE_ENCOUNTER)
		{
		SetEncounterActive(TRUE, oEncuentro);
		}
	oEncuentro = GetNextObjectInArea();
	}

//============================================================================\\
//------------------------ # Limpia los Objetos # ----------------------------\\
//============================================================================\\

object oItem = GetFirstObjectInArea();
while (GetIsObjectValid(oItem) == TRUE)
	{
	if(GetObjectType(oItem)==OBJECT_TYPE_ITEM)
		{
		DelayCommand(fD, DestroyObject(oItem));
		fD=fD+0.1;
		}
	oItem = GetNextObjectInArea();
	}

//============================================================================\\
//------------------------ # Limpia los Efectos # ----------------------------\\
//============================================================================\\

object oEfecto = GetFirstObjectInArea();
while (GetIsObjectValid(oEfecto) == TRUE)
	{
	if(GetObjectType(oEfecto)==OBJECT_TYPE_AREA_OF_EFFECT)
		{
		DelayCommand(fD, DestroyObject(oEfecto));
		fD=fD+0.1;
		}
	oEfecto = GetNextObjectInArea();
	}

//============================================================================\\
//--------------------- # Limpia Bolsa de Cadaveres # ------------------------\\
//============================================================================\\

object oBolsita = GetFirstObjectInArea();
while (GetIsObjectValid(oBolsita) == TRUE)
	{
	if(GetIsPC(oBolsita) || GetIsDM(oBolsita))break;

//	Utilizar para objetos que no queremos que sean eliminados, como cofres y demas.
//	if(GetTag(oBolsita)=="No_se_elimina")
//	   break;

	object oDesecho = GetFirstItemInInventory(oBolsita);
	while(GetIsObjectValid(oDesecho) == TRUE)
		{
		DelayCommand(fD, DestroyObject(oDesecho));
		fD=fD+0.1;

		oDesecho = GetNextItemInInventory(oBolsita);
		}
	oBolsita = GetNextObjectInArea();
	}
}

Este otro tendrás que colocarlo en el OnExit de todas las áreas que quieres que se limpien.
Nombre: rrc_exit_limpia
int SiPC()
{
object oPC = GetFirstObjectInArea();
while(GetIsObjectValid(oPC))
	{
	if(GetIsPC(oPC))
		{
		return TRUE;
		break;
		}
	oPC = GetNextObjectInArea();
	}
return FALSE;
}
void main()
{
object oPC = GetExitingObject();
if (SiPC()==TRUE)return;
DelayCommand(30.0, ExecuteScript("rrc_limpiar", OBJECT_SELF));
}

Editado por Xiulito, 28 January 2009 - 07:35 PM.

¿Saben cual es la diferencia entre un hombre inteligente y uno sabio?
Que el inteligente sabe lo que dice y el sabio sabe cuando decirlo.


#2 TheDragon

TheDragon

    Neonato

  • Miembro
  • PipPip
  • 171 posts

Posteado 16 May 2013 - 07:23 PM

El tiempo que tarda que va por segundos o por minutos?


Nuevo servidor de Neverwinter Night 1: El mundo de Rhi´hender.

Foro: http://rhihenhernwn.foroactivo.com/


#3 Setaka

Setaka

    Ancillae

  • Miembro
  • PipPipPip
  • 371 posts

Posteado 16 May 2013 - 08:29 PM

Diría que por segundos:

 

if (SiPC()==TRUE)return;

DelayCommand(30.0, ExecuteScript("rrc_limpiar", OBJECT_SELF));

 

30 segundos después de salir del área, si en ella no se encuentra ningún jugador, ejecuta el script de limpieza.


Tutorial NWN Scripting: Click aquí


#4 TheDragon

TheDragon

    Neonato

  • Miembro
  • PipPip
  • 171 posts

Posteado 16 May 2013 - 11:05 PM

Perfecto, muchas gracias :)


Nuevo servidor de Neverwinter Night 1: El mundo de Rhi´hender.

Foro: http://rhihenhernwn.foroactivo.com/


#5 Ertos

Ertos

    Elder

  • Miembro
  • PipPipPipPip
  • 679 posts

Posteado 17 May 2013 - 02:04 AM

A ver si podeis hacer algun fix, por que si un pj abandona el area poseyendo al familiar y deja a su pj atrás, el script de limpieza lo lee como que no hay nadie y vacia al pj en cuestion todo su inventario xD...


76561198051392382.png


#6 Setaka

Setaka

    Ancillae

  • Miembro
  • PipPipPip
  • 371 posts

Posteado 17 May 2013 - 11:45 AM

Buah, que heavy xD

 

El problema está en esta parte del código:

//============================================================================\\
//--------------------- # Limpia Bolsa de Cadaveres # ------------------------\\
//============================================================================\\

object oBolsita = GetFirstObjectInArea();
while (GetIsObjectValid(oBolsita) == TRUE)
	{
	if(GetIsPC(oBolsita) || GetIsDM(oBolsita))break;

//	Utilizar para objetos que no queremos que sean eliminados, como cofres y demas.
//	if(GetTag(oBolsita)=="No_se_elimina")
//	   break;

	object oDesecho = GetFirstItemInInventory(oBolsita);
	while(GetIsObjectValid(oDesecho) == TRUE)
		{
		DelayCommand(fD, DestroyObject(oDesecho));
		fD=fD+0.1;

		oDesecho = GetNextItemInInventory(oBolsita);
		}
	oBolsita = GetNextObjectInArea();
	}

 


Se tendría que filtrar, yo pondría la comprobación de que mire si oBolsita es una criatura, y si esta está viva o no (antes ya hemos filtrado que no mire los PJs ni DMs, así que solo se aplicaría para NPCs, que es lo que se considera nuestro muñeco PJ al dominar el familiar). Las vivas que no las toque. Si alguien se anima a intentarlo para practicar, solo es una línea cumpliendo las condiciones, y el "break" para decirle que no siga :)
 
 
Returns the object type (OBJECT_TYPE_*) of oTarget and 0 if oTarget is not a valid object.
 
int GetIsDead(object oCreature);
Returns TRUE if oCreature is a dead NPC, dead PC or a dying PC, otherwise FALSE.
 
 

Tutorial NWN Scripting: Click aquí


#7 TheDragon

TheDragon

    Neonato

  • Miembro
  • PipPip
  • 171 posts

Posteado 17 May 2013 - 12:10 PM

Yo como no se de script tanto como eso no puedo poner el código, pero bueno. Tocaré a ver que sale xD


Nuevo servidor de Neverwinter Night 1: El mundo de Rhi´hender.

Foro: http://rhihenhernwn.foroactivo.com/


#8 Setaka

Setaka

    Ancillae

  • Miembro
  • PipPipPip
  • 371 posts

Posteado 17 May 2013 - 01:54 PM

El scripting es fácil si conoces las funciones y piensas con lógica :)
 
Pista:
 
Si( (es una criatura) y (no está muerta) ){stop!;}

Tutorial NWN Scripting: Click aquí


#9 TheDragon

TheDragon

    Neonato

  • Miembro
  • PipPip
  • 171 posts

Posteado 17 May 2013 - 04:42 PM

Primero tendré que aprenderme las funciones y todo eso, me vendría muy bien puesto que mi servidor está en un lugar alto en sistemas.

Por si surjiera errores y demás, siempre está bien que los pudiera arreglar yo.


Nuevo servidor de Neverwinter Night 1: El mundo de Rhi´hender.

Foro: http://rhihenhernwn.foroactivo.com/


#10 TheDragon

TheDragon

    Neonato

  • Miembro
  • PipPip
  • 171 posts

Posteado 17 May 2013 - 08:59 PM

No doy con la tecla jajaja.


Nuevo servidor de Neverwinter Night 1: El mundo de Rhi´hender.

Foro: http://rhihenhernwn.foroactivo.com/


#11 Setaka

Setaka

    Ancillae

  • Miembro
  • PipPipPip
  • 371 posts

Posteado 23 May 2013 - 12:52 PM

Más fácil imposible:

 

Si -> if

es una criatura -> GetObjectType(oTarget)==OBJECT_TYPE_CREATURE

y-> &&

no está muerta ->  GetIsDead(oTarget)==FALSE   o !GetIsDead(oTarget)

stop! -> break;

 

 

Nadie más que esté aprendiendo scripting se atreve?  :lol:

 

 

 


Tutorial NWN Scripting: Click aquí


#12 TheDragon

TheDragon

    Neonato

  • Miembro
  • PipPip
  • 171 posts

Posteado 24 May 2013 - 09:40 AM

if ((GetObjectType (oTarget)==OBJECT_TYPE_CREATURE) && (GetIsDead(oTarget)==FALSE o ¡GetIsDead (oTarget)) break;

 

Puede ser eso ;/?


Editado por TheDragon, 24 May 2013 - 09:42 AM.

Nuevo servidor de Neverwinter Night 1: El mundo de Rhi´hender.

Foro: http://rhihenhernwn.foroactivo.com/


#13 Setaka

Setaka

    Ancillae

  • Miembro
  • PipPipPip
  • 371 posts

Posteado 24 May 2013 - 05:17 PM

No, el GetIsDead(oTarget)==FALSE y el !GetIsDead (oTarget) es lo mismo, tienes que poner o uno u otro. El ! delante de la función es lo mismo que poner un "==FALSE" :)

 

Prueba a compilar, si no compila es que no está bien :P


Tutorial NWN Scripting: Click aquí


#14 TheDragon

TheDragon

    Neonato

  • Miembro
  • PipPip
  • 171 posts

Posteado 25 May 2013 - 11:40 AM

No encuentro la manera de que compile, dice que la variable no está definida, ¿qué me sugieres?


Nuevo servidor de Neverwinter Night 1: El mundo de Rhi´hender.

Foro: http://rhihenhernwn.foroactivo.com/


#15 Setaka

Setaka

    Ancillae

  • Miembro
  • PipPipPip
  • 371 posts

Posteado 25 May 2013 - 03:28 PM

Que mires qué objeto estás comprobando que esté muerto y es una criatura. Yo te he puesto GetIsDead(oTarget), pero... ¿¿qué o quien demonios es oTarget?? El script no lo sabe ya que no se lo has dicho, y por esto al tratar de compilar se niega y te responde con un "la variable no está definida".


 

Esto es bastante básico. Fíjate al hacer doble click en la función GetIsDead por ejemplo, que en su descripción te saldrá algo como:

 

GetIsDead(object oTarget);

 

Le puedes poner GetIsDead(oTarget), como puedes poner GetIsDead(fulanito), GetIsDead(oBicho) o GetIsDead(ElNombreQueQuieras), mientras definas quien es el objeto sobre el que actúa cada función (es decir, ponerle un nombre). Lo mismo con el GetObjectType(oTarget).

 

 

Por lo que tienes que definir el "objeto" al que se aplica la función. Busca en el script, y quizás esté ya definido con otro nombre...  :P


Tutorial NWN Scripting: Click aquí




Responder



  


A Bragol. Tus amigos te echan de menos.