Neverwinter Nights, modding - scripts - manuales, todo sobre el NWN
¿Quieres reaccionar a este mensaje? Regístrate en el foro con unos pocos clics o inicia sesión para continuar.


Pulse Control+D para no olvidar este enlace.
 
Pagina principalÍndicePortalÚltimas imágenesBuscarRegistrarseConectarsePagina principal

 

 "Encarcelar a los PJs"

Ir abajo 
AutorMensaje
Xiulito
Administrador/a
Administrador/a
Xiulito


Masculino
Edad : 44
Localización : Vivo aqui
Puntos de Actividad : 6817

Cantidad de envíos : 101
Fecha de inscripción : 22/03/2008

Nº. de Miembro : 1
Respeto por el Foro :
"Encarcelar a los PJs" Left_bar_bleue100 / 100100 / 100"Encarcelar a los PJs" Right_bar_bleue


"Encarcelar a los PJs" Empty
MensajeTema: "Encarcelar a los PJs"   "Encarcelar a los PJs" I_icon_minitimeDom 25 Ene 2009, 10:23 pm

Funcionamiento: Con un objeto de DM podremos encarcelar a los jugadores que se porten mal, a estos se les creara un objeto en el inventario que no podrán soltar y cada vez que se metan en el modulo iran directos a la cárcel aunque se reinicie el server, el sistema consta de 6 celdas aunque con un poco de conocimientos se puede ampliar, cada vez que el DM utilice el objeto contra un jugador no tendrá que preocuparse de encarcelar a dos PCs en la misma celda ya que automáticamente iran encarcelándose los jugadores en las celdas consecutivamente, el 1º en la celda 1, el 2º en la 2 y así sucesivamente, lógicamente si las celdas están llenas...
Una vez salte la conversación de opciones de encarcelado podremos decidir la sanción que impondremos al infractor, llevando la cuenta de 5 en 5 horas de juego, tenemos que tener en cuenta que en propiedades de modulo, avanzado, podremos editar la duración de una hora de juego en tiempo real.
Cada 2 minutos (suponiendo que la relación de juego/realidad es de 1Hora/2Minutos) se ejecutara un script automáticamente sobre todo aquel que este encarcelado, el cual ira disminuyendo la condena en una hora y llegado a 0 el preso quedara libre mandándolo al punto de ruta "WP_SalCarcel", si la relación en tiempo de juego/realidad no queremos ponerla de 1hora/2Minutos tendremos que cambiar el tiempo del DelayCommand() del script "rc_execarcel" al tiempo que pongamos por defecto, el jugador podrá saber en todo momento el tiempo que le queda para salir del trullo utilizando el objeto que se le creo en el inventario.

WP: Habilitaremos 6 celdas para meter a nuestros presos y en cada una pondremos un punto de ruta y les daremos de etiqueta "WP_Celda_1", "WP_Celda_2"......etc, también crearemos otro punto de ruta con etiqueta "WP_SalCarcel" que nos servirá para mandar a los PCs una vez cumplan su condena.

Objeto Esposas: Crearemos un objeto misceláneos de poder único para si, sin límite de usos/día y le daremos la etiqueta "rc_carcel", este objeto tiene que ser de trama, también asegúrate de marcar las casillas de identificado y no se puede soltar, este objeto servirá para marcar al preso y tenerlo controlado, mientras un jugador tenga este objeto significara que es un preso, el delincuente podrá utilizar este objeto, siempre que quiera, para ver el tiempo de condena que le queda por cumplir.

Objeto Encarcelar: Crearemos otro objeto misceláneos de poder único, sin límite de usos/día y le daremos la etiqueta "rc_convcarcel", este objeto sera para los DMs y tendrá el poder de encarcelar a los jugadores, asegúrate de que pueda escoger objetivos poniéndolo de poder único y no de poder único para si, lo que hará es lanzar una conversación y desde ella elegir las opciones de encarcelado.

Conversación: Crea una conversación parecida a esta...

https://i.servimg.com/u/f75/12/15/88/05/conv_c10.jpg


Bueno una vez creado todo esto solo queda crear los scripts:

Este script no hace falta que lo pongas en ningún lado, es suficiente con tenerlo creado.

Nombre: rc_baul
Código:
void JumpToWP(object oPC, string sWP, float fTiempo=0.0)
{
DelayCommand(fTiempo, AssignCommand(oPC, ClearAllActions()));
DelayCommand(fTiempo+0.1, AssignCommand(oPC, JumpToObject(GetWaypointByTag(sWP))));
}

int IsInInventory(object oContainer, string sItemTag)
{
object oItem;

if (GetHasInventory(oContainer))
    {
    oItem = GetFirstItemInInventory(oContainer);
    while (OBJECT_INVALID != oItem)
        {
        if (GetTag(oItem) == sItemTag)
            {return TRUE;}

        oItem = GetNextItemInInventory(oContainer);
        }
    }
return FALSE;
}



Este sera el que le diga al PC el tiempo de condena que le queda por cumplir, no hace falta que se ponga en ningún lado.

Nombre: rc_carcel
Código:
#include "rc_baul"
void main()
{
object oPC = GetItemActivator();
object oItem = GetItemActivated();

int iCondena = GetLocalInt(oItem, "Condena");

FloatingTextStringOnCreature("Tu Condena asciende a "+IntToString(iCondena)+" hora/s de juego.", oPC);
}



Este es el que lance la conversación de opciones para el encarcelado, es suficiente con tenerlo creado.

Nombre: rc_convcarcel
Código:
void main()
{
object oPC = GetItemActivator();
AssignCommand(oPC, ActionStartConversation(oPC, "conv_carcel", TRUE, FALSE));
}



Este script tienes que ponerlo en propiedades del modulo, sucesos, OnPlayerEquipItem y lo que hace es desequipar al PC si esta encarcelado por si se le ocurre ponerse hostil desde la celda y le da por lanzar flechas a todo aquel que vea.

Nombre: rc_desequipacarc
Código:
#include "rc_baul"
void main()
{
object oPC = GetPCItemLastEquippedBy();
object oArma1 = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPC);
object oArma2 = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPC);

if (IsInInventory(oPC, "rc_carcel"))
    {
    DelayCommand(0.5, AssignCommand(oPC, ActionUnequipItem(oArma1)));
    DelayCommand(1.0, AssignCommand(oPC, ActionUnequipItem(oArma2)));
    return;
    }
}



El siguiente ira en la línea de la conversación que dice "Encarcelar objetivo:...." y es para meter preso a los PCs, este script hara de trama al jugador para evitar que se suicide o que otros jugadores le maten para ir al limbo y poder librarse así de las garras de la justicia.

Nombre: rc_encarcelar
Código:
#include "rc_baul"
void main()
{
object oPC = GetPCSpeaker();
object oPCTarget = GetItemActivatedTarget();
object oItem = GetItemActivated();
int iCondenaPC = GetLocalInt(oPC, "Condena");
int iControlCeldas = GetLocalInt(oItem, "ControlCeldas");
int iNewControlCeldas = ++iControlCeldas;

if (iNewControlCeldas==0 || iNewControlCeldas>6){iNewControlCeldas=1;}

string sNumCelda = IntToString(iNewControlCeldas);

if (IsInInventory(oPCTarget, "rc_carcel"))
    {
    object oCarcelPosses = GetItemPossessedBy(oPCTarget, "rc_carcel");
    int iCondena = GetLocalInt(oCarcelPosses, "Condena");

    SetLocalInt(oCarcelPosses, "Condena", iCondena+iCondenaPC);
    SetLocalInt(oPC, "Condena", 5);

    SendMessageToPC(oPCTarget, "Tu condena aumenta en "+IntToString(iCondenaPC)+" horas.");
    return;
    }

object oCarcelCreate = CreateItemOnObject("rc_carcel", oPCTarget);

SetLocalInt(oCarcelCreate, "Condena", iCondenaPC);
SetLocalInt(oPC, "Condena", 5);
SetPlotFlag(oPCTarget, TRUE);

SendMessageToPC(oPCTarget, "Has sido encarcelado por "+IntToString(iCondenaPC)+" horas de juego.");
SetLocalInt(oItem, "ControlCeldas", iNewControlCeldas);

object oArma1 = GetItemInSlot(INVENTORY_SLOT_RIGHTHAND, oPCTarget);
object oArma2 = GetItemInSlot(INVENTORY_SLOT_LEFTHAND, oPCTarget);
AssignCommand(oPCTarget, ActionUnequipItem(oArma1));
AssignCommand(oPCTarget, ActionUnequipItem(oArma2));

JumpToWP(oPCTarget, "WP_Celda_"+sNumCelda, 0.5);

DelayCommand(120.0, Executescript("rc_execarcel", oPCTarget));
}



Colocaremos el siguiente script en un desencadenante en la entrada del modulo o en un sitio que estemos seguros de que cada uno de los jugadores que entra pasa por el, en el OnEnter del desencadenante.

Nombre: rc_entercarcel
Código:
#include "rc_baul"
void main()
{
object oPC = GetEnteringObject();
string sNum = IntToString(d6());

if (!IsInInventory(oPC, "rc_carcel"))return;

SendMessageToPC(oPC, "Todavia no has cumplido tu condena, vuelves a la carcel.");
SetPlotFlag(oPC, TRUE);

JumpToWP(oPC, "WP_Celda_"+sNum);

DelayCommand(120.0, Executescript("rc_execarcel", oPC));
}



Este sera suficiente con tenerlo creado y sera el que se encargue de disminuir la condena a los PCs automáticamente, se ejecuta sobre el jugador cada 2 minutos.

Nombre: rc_execarcel
Código:
#include "rc_baul"
void main()
{
object oPC = OBJECT_SELF;

if (!IsInInventory(oPC, "rc_carcel"))return;

object oCarcel = GetItemPossessedBy(oPC, "rc_carcel");
int iCondena = GetLocalInt(oCarcel, "Condena");

if (iCondena>0)
    {
    SetLocalInt(oCarcel, "Condena", --iCondena);

    if (iCondena<5)
        SendMessageToPC(oPC, "Te quedan menos de 5 horas para terminar tu condena.");
    }
else
    {
    SetPlotFlag(oPC, FALSE);
    DestroyObject(oCarcel);
    SendMessageToPC(oPC, "Tu condena ha finalizado, eres libre.");
    JumpToWP(oPC, "WP_SalCarcel", 3.0);
    return;
    }

DelayCommand(120.0, Executescript("rc_execarcel", oPC));
}



En la línea "Liberar objetivo" de la conversación pondremos el siguiente script y básicamente lo que hace es eso... Liberar el objetivo

Nombre: rc_liberar
Código:
#include "rc_baul"
void main()
{
object oPC = GetPCSpeaker();
object oPCTarget = GetItemActivatedTarget();

if (!IsInInventory(oPC, "rc_carcel"))return;

object oCarcel = GetItemPossessedBy(oPC, "rc_carcel");

SetPlotFlag(oPC, FALSE);
DestroyObject(oCarcel);
SendMessageToPC(oPC, "Tu condena ha finalizado, eres libre.");
JumpToWP(oPC, "WP_SalCarcel", 2.0);
}



En la línea "Disminuir condena del objetivo en 5 horas" pondremos este otro, esta línea le quitara 5 horas, automáticamente, a la condena del objetivo seleccionado.

Nombre: rc_menos5
Código:
#include "rc_baul"
void main()
{
object oPC = GetPCSpeaker();
object oPCTarget = GetItemActivatedTarget();

if (IsInInventory(oPCTarget, "rc_carcel"))return;

object oCarcel = GetItemPossessedBy(oPCTarget, "rc_carcel");
int iCondena = GetLocalInt(oCarcel, "Condena");

if (iCondena<6)return;

SetLocalInt(oCarcel, "Condena", iCondena-5);

SendMessageToPC(oPCTarget, "Tu condena disminuye en 5 horas.");
}



En la línea "Añadir 5 horas a la condena" colocamos este script, que lo que hará es ir sumando de 5 en 5 para luego definir el total de la condena que queremos imponer.

Nombre: rc_sumacondena
Código:
#include "rc_baul"
void main()
{
object oPC = GetPCSpeaker();
int iCondena = GetLocalInt(oPC, "Condena");

if (iCondena<150)
    {SetLocalInt(oPC, "Condena", iCondena+5);}

SetCustomToken(123456, IntToString(iCondena));
}



En la línea "Restar 5 horas a la condena" este otro.

Nombre: rc_restacondena
Código:
#include "rc_baul"
void main()
{
object oPC = GetPCSpeaker();
int iCondena = GetLocalInt(oPC, "Condena");

if (iCondena>0)
    {SetLocalInt(oPC, "Condena", iCondena-5);}

SetCustomToken(123456, IntToString(iCondena));
}



Y por último, colocaremos este script en las líneas "Sistema de Justicia" y "Debes tener un objetivo seleccionado. La condena...", que le darán un valor al token creado.

Nombre: rc_token
Código:
#include "rc_baul"
void main()
{
object oPC = GetPCSpeaker();
int iCondenaPC = GetLocalInt(oPC, "Condena");

SetCustomToken(123456, IntToString(iCondenaPC));
}


NOTA IMPORTANTE: Es importante ponerle a los scripts el mismo nombre que he ido poniendo yo aquí ya que de lo contrario no funcionara a no ser que se retoquen algunos script…
Volver arriba Ir abajo
http://nwnforo.com
 
"Encarcelar a los PJs"
Volver arriba 
Página 1 de 1.
 Temas similares
-
» "Muro invisible que impide el paso"
» "Cerrar puertas con llave durante la noche"
» Scripts para el baul "Esposas y Rastreo"

Permisos de este foro:No puedes responder a temas en este foro.
Neverwinter Nights, modding - scripts - manuales, todo sobre el NWN :: NWToolSet (Aurora) :: Scripting NWN :: Baul de Scripts-
Cambiar a: