//Script Name: oncliententer
////////////////////////////////////////
//Created by Genisys / Guile
//Created On: 6/14/08 (Updated 8/10/08)
////////////////////////////////////////
/*
This my premier OnClientEnter Module Event Script for all my modules
(click edit / module properties to select this script for the event)

*/
/////////////////////////////////////////////////////////////////
/*
This script does multiple things, it checks to see if...
If the PC is immortal or level 40 (apply special effects)
If the character they have has been banned. (not a total bann)
If they logged out while dead, if so make them dead instantly!!! ;)
If the player is playing a legal character or not...read below..
And if the Player themself have been banned from the module or not..
*/
//////////////////////////////////////////////////////////////////////
#include "nwnx_player"
//Required Include For Color Messages(Read include to learn more)
#include "gen_inc_color"
#include "inc_utility"

//Redundant Variables Declared
effect eEffect;
int nInt;
object oItem;
object aTarget;
location bTarget;

//Required Include for SimTools
//#include "fky_chat_inc"

void SetTlkOverrideForMaximumLevel(object oPC);

void SetTlkOverrideForMaximumLevel(object oPC)
{
	int nLevel = GetHitDice(oPC);
	
	if (nLevel < 40)
	{
		NWNX_Player_SetTlkOverride(oPC, 315, "");
	}
	else
	{
		NWNX_Player_SetTlkOverride(oPC, 315, "Next Level: " + IntToString((nLevel + 1) * nLevel * 500) + "\n");
	}
}

//Main Script
void main()
{
	ExecuteScript("prc_onenter", OBJECT_SELF);
	ExecuteScript("sd_soc_install", OBJECT_SELF);
	
	//Declare Major Variables..
	object oPC;
	oPC = GetEnteringObject();
	object oTarget;
	oTarget = oPC;
	object oPlayer = oPC;
	object oPP = oPC;
	string sCDKey = GetPCPublicCDKey(oPC, FALSE);

	SetTlkOverrideForMaximumLevel(oPC);

//IMPORTANT, please set the Nap Time Below!
//If changed here you must open the script "kopcwand" and adjust it there!
	object oNap = GetItemPossessedBy(oPC, "napper");
	
	if(oNap !=OBJECT_INVALID)
	{
	//Only on PCs!
		if(GetIsPC(oPC) && !GetIsDM(oPC) && !GetIsDMPossessed(oPC))
		{
		//Start the nap all over again!   (the 15 = minutes of nap!)
			SetLocalInt(oTarget, "NAP_TIME", 15); //set 15 to your taste
		//Allow them to actually enter the module...
			DelayCommand(12.0, ExecuteScript("naptime", oPC));
			return;
		}
	}

//Only for DMs!
	if(GetIsDM(oPC))
	{
		AddJournalQuestEntry("dmrules", 1, oPC, FALSE, FALSE);
		return; 
	}


///////////////////////////////////////////////////////////////////////////
//SIMTOOLS

//DISABLED IT"S BUGGED!
/*
    Speech_OnClientEnter(oPC);
    int nPerm, nPerm2;
    if (USING_NWNX_DB)
    {
        nPerm = GetPersistentInt(GetModule(), "FKY_CHT_BANSHOUT" + sCDKey);
        nPerm2 = GetPersistentInt(GetModule(), "FKY_CHT_BANPLAYER" + sCDKey);;
        if (ENABLE_LANGUAGES) DoLanguageSetupNWNX(oPC);
    }
    else //using Bioware db
    {
        nPerm = GetCampaignInt("FKY_CHT", "FKY_CHT_BANSHOUT" + sCDKey);
        nPerm2 = GetCampaignInt("FKY_CHT", "FKY_CHT_BANPLAYER" + sCDKey);
        if (ENABLE_LANGUAGES) DoLanguageSetupBio(oPC);
    }
    if (nPerm) SetLocalInt(oPC, "FKY_CHT_BANSHOUT", TRUE);
    if (nPerm2 || GetLocalInt(oPC, "FKY_CHT_BANPLAYER")) DoBoot(oPC);//Boot them if Valid Object
    else if (VAULTPATH_CHAT != "")
    {
        string Script = GetLocalString(oPC, "LetoScript");
        if( Script != "" ) SetLocalString(oPC, "LetoScript", "");
    }

*/
//////////////////////////////////////////////////////////////////////////


//Please leave the credits to the module within the message.

//Colorful Server Message sent to all PCs when they enter the module..
	string sMessage;
	sMessage = GetRGB(1,7,7); //The color (See above)
	sMessage +=  "Welcome to ";  //The text to be colorized by the above color.
	sMessage += GetRGB(15,15,1);//The next color.
	sMessage +=  "Server Genisys "; //The next text to be colorized by the above color.
	sMessage += GetRGB(15,1,1);//etc..
	sMessage +=  "a Revised ";
	sMessage += GetRGB(7,7,15);
	sMessage +=  "1.69  ";
	sMessage += GetRGB(1,15,1);
	sMessage +=  "Paths of Ascension ";
	sMessage += GetRGB(13,9,13);
	sMessage +=  "Classic Module ";
	sMessage += GetRGB(12,10,7);
	sMessage +=  "Revised & ";
	sMessage += GetRGB();
	sMessage +=  "Rescripted By ";
	sMessage += GetRGB(15,5,1);
	sMessage +=  "Genisys (Guile) ";
	sMessage += GetRGB(12,10,7);
	sMessage += "from 8/20/08 to 3/21/09.";
	string sNewb = GetRGB(1,15,1) + "This is PRC Presents Path of Ascension.";
	string sNewb2 = GetRGB(1,15,1) + "Contact Altpersona on Discord if you need assistance.";
//string sNewb = GetRGB(1,15,1) + "Be sure to read your journal frequently (press J).";
//string sNewb2 = GetRGB(1,15,1) + "Be sure to examine the Rest Menu carefully.";

	string sEnter = GetName(oPC) + " / " + GetPCPlayerName(oPC) + " / " + GetPCPublicCDKey(oPC) + " / " + GetPCIPAddress(oPC) + " Entered." ;
	SendMessageToAllDMs(sEnter);

//Get all the stats on the player when they enter the module...
	WriteTimestampedLogEntry(sEnter);

//Float welcome message by..
	DelayCommand(15.3, FloatingTextStringOnCreature(sMessage, oPC, FALSE));

	if(GetHitDice(oPC)<=6)
	{
		DelayCommand(19.3, FloatingTextStringOnCreature(sNewb, oPC, FALSE));
		DelayCommand(27.3, FloatingTextStringOnCreature(sNewb2, oPC, FALSE));
	}
//This means the entering Character has been banned.
	int nBann = GetCampaignInt(GetName(GetModule()), "CBANN", oPP);

	object oTag;
	location lTag;

//This part is about verifying the Player's name..
//A player must have at least a 2 character name or they are going to
//return with an error!  If they have spaces in their name it will return
//with an error as well, including alt code!
	string sPCNM = GetName(oPP);
	string sPCNMR = GetStringRight(sPCNM, 2);
	string sNC1; string sNC2; string sRNC1; string sRNC2;
	int nBad;

//Find the second character of the players name..
	sNC1 = GetSubString(sPCNM, 0, 1);
//Find the second character of the players name..
	sNC2 = GetSubString(sPCNM, 0, 2);
//Find the last letter in the player's name.
	sRNC1 = GetSubString(sPCNMR, 0, 1);
//Find the next to the last letter in the player's name.
	sRNC2 = GetSubString(sPCNMR, 0, 2);

/////////////////////////IMPORTANT//////////////////////////////////
//You must make all the "" below into " " to check for legal names
//I turned it off because a lot of my characters have bad names!
//Simply put the cursor between "" and hit the space bar for "" to " "
	if(sNC1 =="")
	{ nBad =1; }
	else if(sNC2 =="")
	{ nBad =1; }
	else if(sRNC1 =="")
	{ nBad =1; }
	else if(sRNC2 =="")
	{ nBad =1; }
	else { nBad = 0; }

//See below to activate this system..
////////////////////////////////////////////////////////////////////////////

//This is for the rest of the script, if it's not a PC stop here!
	if(!GetIsPC(oPC))return;


/////////////////////////////////////////////////////////////////////////////

//These function add journal entries by the tag names below
//If you wish to create more, just copy / paste and change
//The tagname which is in "here", and the entry # remains 1 only!

//AddJournalQuestEntry("spells", 1, oPC, FALSE, FALSE);
//AddJournalQuestEntry("x2spells", 1, oPC, FALSE, FALSE);
//AddJournalQuestEntry("feats", 1, oPC, FALSE, FALSE);
//AddJournalQuestEntry("shifter", 1, oPC, FALSE, FALSE);
    AddJournalQuestEntry("JRNL_XPCHART", 1, oPC, FALSE, FALSE, FALSE);
    AddJournalQuestEntry("JRNL_LA_BUYOFF", 1, oPC, FALSE, FALSE, FALSE);	
	AddJournalQuestEntry("JRNL_PRC8", 1, oPC, FALSE, FALSE, FALSE);

	AddJournalQuestEntry("serverrules", 1, oPC, FALSE, FALSE);
//AddJournalQuestEntry("legartjournal", 1, oPC, FALSE, FALSE);


	if(GetHitDice(oPC) <=5)
	{
		AddJournalQuestEntry("legartjournal", 1, oPC, FALSE, FALSE);
	}

//////////////////IMPORTANT////////////////IMPORTANT////////////////////////

//This function scans the Entering PC to see if they have a legal character.
//Delete the // Below to activate the anti-cheat script
//DelayCommand(9.0, ExecuteScript("cheatercheck2", oPC));

/////////////////////////////////////////////////////////////////////////////
//If level 40 lets do some cool stuff to them :) (optional of course)
//If you do not wish to use this options you will need to delete the // below
                        //                      /* <<(don't touch this part)

    if(GetHitDice(oPC) == 40 || GetItemPossessedBy(oPC, "guildpass")!=OBJECT_INVALID)
    {
    //Lets make the concealed 50%
		eEffect = EffectConcealment(50);
		eEffect = SupernaturalEffect(eEffect);
		ApplyEffectToObject(DURATION_TYPE_PERMANENT, eEffect, oPC);

    //Lets make the look like a ghost.. :)
    //To activate, simply delete the // below this line
    //ApplyEffectToObject(DURATION_TYPE_PERMANENT, SupernaturalEffect(EffectVisualEffect(VFX_DUR_GLOW_WHITE)), oPC);

    }

// don't touch this line */
//////////////////////////////////////////////////////////////////////////////

//This is the immortal option, you must utilize the "makeimmortal" script
//to make players immortal (please read that script.)
	if(GetItemPossessedBy(oPC, "immotoken") != OBJECT_INVALID)
	{
	//Run this script on the player (See script to configure settings)
		ExecuteScript("powerimmortal", oPC);
	}

//////////////////////////////////////////////////////////////////////////////
//If a player has been found with an illegal character they will have this item.
//It will prevent them from logging onto your server with that character.
//Note this will only work if you have activated the Anti-Cheat option above!
/*
if (GetItemPossessedBy(oPC, "banned")!= OBJECT_INVALID)
   {
   AssignCommand(oPC, ClearAllActions());

   SetCutsceneMode(oPC, TRUE);

   SetCameraMode(oPC, CAMERA_MODE_CHASE_CAMERA);

   DelayCommand(4.0, FloatingTextStringOnCreature("You have an illegal character which is not allowed on this server.", oPC));

   DelayCommand(5.0, SetCutsceneMode(oPC, FALSE));

   DelayCommand(6.0, BootPC(oPC));

   }
// */
////////////////////////////////////////////////////////////////////////////
	object oDeath = GetItemPossessedBy(oPC, "death");

//Since the player was dead when they logged, kill them!
	if (oDeath!=OBJECT_INVALID)
	{
    //FIRST REMOVE THE DEATH TOKEN!!
		DestroyObject(oDeath, 0.0f);

		effect eEffect;
		eEffect = EffectDamage(3000, DAMAGE_TYPE_POSITIVE, DAMAGE_POWER_ENERGY);
		eEffect = SupernaturalEffect(eEffect);
		DelayCommand(5.8, ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC));
		DelayCommand(6.2, ApplyEffectToObject(DURATION_TYPE_INSTANT, eEffect, oPC));
		DelayCommand(7.0, FloatingTextStringOnCreature
		("<c��6>Logging out to cheat death is not permitted on this server, YOU HAVE BEEN WARNED!</c>", oPC, TRUE));

		SendMessageToAllDMs(GetName(oPC) + " HAS LOGGED OUT TO CHEAT DEATH!");
   }

////////////////////////////////////////////////////////////////////////
//Handling BANN on this server...

//Let's see if the entering PC has been banned Altogether!
	if(GetCampaignInt(GetName(GetModule()), "ADMIN_BANN", oPP)==2)
	{
		//Boot the PC fast!
		DelayCommand(3.3, BootPC(oPP));
		return;
	}

//Let's see if the player's character has been banned..
	if(GetItemPossessedBy(oPP, "char_bann")!=OBJECT_INVALID)
	{

		//If so boot them fast!
		DelayCommand(2.5, BootPC(oPP));

		return;
	}



//////////////////////////////////////////////////////////////////////////////
//Let's prevent badly named characters from logging onto the server..

//Delete the /* below this line to activate the name checking system.
/*

//Let's verify the Entering PC has a legal name!

//NOTE This function works in conjunction with another script
//in which an NPC at the start verifies if the PC is playing a legal name.

//If the first 2 or last 2 letters of their name are bad..
if(nBad==1)
{
//Delay the following to allow the PC to enter the module..
DelayCommand(10.0,
FloatingTextStringOnCreature("You character name is not allowed!", oPP));

//Tell the database the player character is banned
DelayCommand(11.0, SetCampaignInt(GetName(GetModule()), "BANN", 1, oPP));

//Boot the PC
DelayCommand(14.0, BootPC(oPP));

return;
}

else
{
//do nothing..
}

//  (do not touch this line!) */
///////////////////////////////////////////////////////////////

//End Script
}