* auto-load all .def files in ./scripts/ directory after executing _startup.def
* fixed exception at DefScript:substr when called with empty string * added 3 new functions: uppercase, lowercase, random[,<min>] <max>. * added some better debug output when an incorrect script is loaded
This commit is contained in:
parent
7961aa9046
commit
a3ae8273ba
@ -7,13 +7,6 @@ LOG * DefScript StartUp [${@version_short}]...
|
|||||||
// loads & applies the configuration
|
// loads & applies the configuration
|
||||||
CONFIG
|
CONFIG
|
||||||
|
|
||||||
// preload the scripts, however its not important to load them now.
|
|
||||||
//they will get loaded automatically if needed
|
|
||||||
LOADALL
|
|
||||||
|
|
||||||
// RELOADDEF myscript
|
|
||||||
// ...
|
|
||||||
|
|
||||||
// set permissions for internal functions
|
// set permissions for internal functions
|
||||||
INTERNAL_PERM
|
INTERNAL_PERM
|
||||||
|
|
||||||
|
|||||||
3
bin/scripts/gcl.def
Normal file
3
bin/scripts/gcl.def
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
// write leetspeak to channel generalchat (see gc.def)
|
||||||
|
#permission=0
|
||||||
|
gc ?{toleet ${@def}}
|
||||||
3
bin/scripts/sl.def
Normal file
3
bin/scripts/sl.def
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
// say leetspeak text. gmcommands can't be executed this way
|
||||||
|
#permission=0
|
||||||
|
s,{${@0}} ?{toleet ${@def}}
|
||||||
35
bin/scripts/slap.def
Normal file
35
bin/scripts/slap.def
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
// purpose: let a player fly. (at least works on MaNGOS)
|
||||||
|
// args: @def: player name
|
||||||
|
// returns: guid of the targeted player, else false. empty string if we are not in the world.
|
||||||
|
#permission=100
|
||||||
|
|
||||||
|
// we can use this script only if we are in the world
|
||||||
|
if ?{not ${@inworld}}
|
||||||
|
logerror Can't slap anything if i am not in the world!
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
// normalize player name. first char uppercased, rest lowercased.
|
||||||
|
set,name ?{uppercase ?{substr,1 ${@def}}}
|
||||||
|
out name1: ${name}
|
||||||
|
set,len ?{strlen ${@def}}
|
||||||
|
out strlen: ${len}
|
||||||
|
sub,len 1
|
||||||
|
out len: ${len}
|
||||||
|
append,name ?{lowercase ?{substr,${len},1 ${@def}}}
|
||||||
|
out name2: ${name}
|
||||||
|
|
||||||
|
|
||||||
|
// target the player. if targeting was successful, cast spell "Knockback 500".
|
||||||
|
set,t ?{target ${name}}
|
||||||
|
if ${t}
|
||||||
|
logdebug slapping player '${name}'
|
||||||
|
castspell 11027
|
||||||
|
target 0
|
||||||
|
else
|
||||||
|
logerror Can't target player '${name}'
|
||||||
|
endif
|
||||||
|
|
||||||
|
unset name
|
||||||
|
|
||||||
|
return ${t}
|
||||||
95
bin/scripts/toleet.def
Normal file
95
bin/scripts/toleet.def
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
// toleet.def
|
||||||
|
// ==========
|
||||||
|
// purpose: convert any text into leetspeak [1337sp34k]
|
||||||
|
// args:
|
||||||
|
// @def: the text to convert
|
||||||
|
// returns: leetspeak^^
|
||||||
|
|
||||||
|
// call it from script only
|
||||||
|
#permission=255
|
||||||
|
|
||||||
|
#onload
|
||||||
|
// this can be used by other scripts to check if we have loaded this script
|
||||||
|
set,#HAVE_LEET true
|
||||||
|
#endonload
|
||||||
|
|
||||||
|
// --- Begin of main function ---
|
||||||
|
|
||||||
|
// empty the string where the leet will be stored
|
||||||
|
set,str
|
||||||
|
|
||||||
|
// total length of the string to convert
|
||||||
|
set,l ?{strlen ${@def}}
|
||||||
|
|
||||||
|
// position counter
|
||||||
|
set,x 0
|
||||||
|
|
||||||
|
loop
|
||||||
|
|
||||||
|
// check if we have reached the end of the string
|
||||||
|
if ?{bigger,${x} ${l}}
|
||||||
|
exitloop
|
||||||
|
endif
|
||||||
|
|
||||||
|
// c stores current char (@def at position x); c2 is the same char but always lowercased
|
||||||
|
set,c ?{substr,1,${x} ${@def}}
|
||||||
|
set,c2 ?{lowercase ${c}}
|
||||||
|
|
||||||
|
// conversion functions:
|
||||||
|
|
||||||
|
// note that "+" is a variable name here!
|
||||||
|
// it will store the "new" char if c/c2 could be converted
|
||||||
|
|
||||||
|
if ?{equal,${c2} a}
|
||||||
|
set,+ 4
|
||||||
|
endif
|
||||||
|
if ?{equal,${c2} e}
|
||||||
|
set,+ 3
|
||||||
|
endif
|
||||||
|
if ?{equal,${c2} i}
|
||||||
|
set,+ !
|
||||||
|
endif
|
||||||
|
if ?{equal,${c2} l}
|
||||||
|
set,+ 1
|
||||||
|
endif
|
||||||
|
if ?{equal,${c2} t}
|
||||||
|
set,+ 7
|
||||||
|
endif
|
||||||
|
if ?{equal,${c2} s}
|
||||||
|
set,+ 5
|
||||||
|
endif
|
||||||
|
if ?{equal,${c2} o}
|
||||||
|
set,+ 0
|
||||||
|
endif
|
||||||
|
if ?{equal,${c2} f}
|
||||||
|
set,+ ph
|
||||||
|
endif
|
||||||
|
if ?{equal,${c2} h}
|
||||||
|
set,+ #
|
||||||
|
endif
|
||||||
|
if ?{equal,${c} Z}
|
||||||
|
set,+ 7
|
||||||
|
endif
|
||||||
|
if ?{equal,${c} R}
|
||||||
|
set,+ 2
|
||||||
|
endif
|
||||||
|
if ?{equal,${c} B}
|
||||||
|
set,+ <3
|
||||||
|
endif
|
||||||
|
|
||||||
|
// if var "+" is still empty, default it to our current char
|
||||||
|
default,+ ${c}
|
||||||
|
// and append it to the final output
|
||||||
|
append,str ${+}
|
||||||
|
// finally delete it again
|
||||||
|
unset +
|
||||||
|
// and increase the counter by 1
|
||||||
|
add,x 1
|
||||||
|
endloop
|
||||||
|
|
||||||
|
unset l
|
||||||
|
unset x
|
||||||
|
unset c
|
||||||
|
unset c2
|
||||||
|
|
||||||
|
return ${str}
|
||||||
@ -84,6 +84,9 @@ void DefScriptPackage::_InitFunctions(void)
|
|||||||
AddFunc("or",&DefScriptPackage::func_or);
|
AddFunc("or",&DefScriptPackage::func_or);
|
||||||
AddFunc("xor",&DefScriptPackage::func_xor);
|
AddFunc("xor",&DefScriptPackage::func_xor);
|
||||||
AddFunc("substr",&DefScriptPackage::func_substr);
|
AddFunc("substr",&DefScriptPackage::func_substr);
|
||||||
|
AddFunc("uppercase",&DefScriptPackage::func_uppercase);
|
||||||
|
AddFunc("lowercase",&DefScriptPackage::func_lowercase);
|
||||||
|
AddFunc("random",&DefScriptPackage::func_random);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DefScriptPackage::AddFunc(std::string n,DefReturnResult (DefScriptPackage::*f)(CmdSet& Set))
|
void DefScriptPackage::AddFunc(std::string n,DefReturnResult (DefScriptPackage::*f)(CmdSet& Set))
|
||||||
@ -155,12 +158,14 @@ bool DefScriptPackage::LoadByName(std::string name){
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool DefScriptPackage::LoadScriptFromFile(std::string fn, std::string sn){
|
bool DefScriptPackage::LoadScriptFromFile(std::string fn, std::string sn){
|
||||||
if(fn.empty() || sn.empty()) return false;
|
if(fn.empty() || sn.empty())
|
||||||
|
return false;
|
||||||
|
|
||||||
std::string label, value, line;
|
std::string label, value, line;
|
||||||
std::fstream f;
|
std::fstream f;
|
||||||
bool load_debug=false,load_notify=false, exec=false, cantload=false;
|
bool load_debug=false,load_notify=false, exec=false, cantload=false;
|
||||||
char z;
|
char z;
|
||||||
|
unsigned int absline=0;
|
||||||
|
|
||||||
f.open(fn.c_str(),std::ios_base::in);
|
f.open(fn.c_str(),std::ios_base::in);
|
||||||
if(!f.is_open())
|
if(!f.is_open())
|
||||||
@ -182,6 +187,7 @@ bool DefScriptPackage::LoadScriptFromFile(std::string fn, std::string sn){
|
|||||||
break;
|
break;
|
||||||
line+=z;
|
line+=z;
|
||||||
}
|
}
|
||||||
|
absline++;
|
||||||
if(line.empty())
|
if(line.empty())
|
||||||
continue; // line is empty, proceed with next line
|
continue; // line is empty, proceed with next line
|
||||||
|
|
||||||
@ -274,7 +280,7 @@ bool DefScriptPackage::LoadScriptFromFile(std::string fn, std::string sn){
|
|||||||
}
|
}
|
||||||
if(mismatch || bopen) // no bracket must be left open now
|
if(mismatch || bopen) // no bracket must be left open now
|
||||||
{
|
{
|
||||||
printf("DefScript: Bracket mismatch at line '%s'\n",line.c_str());
|
printf("DefScript [%s:%u]: Bracket mismatch at line '%s'\n",sn.c_str(),absline,line.c_str());
|
||||||
continue; // continue with next line without adding the current line to script
|
continue; // continue with next line without adding the current line to script
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -292,7 +298,7 @@ bool DefScriptPackage::LoadScriptFromFile(std::string fn, std::string sn){
|
|||||||
f.close();
|
f.close();
|
||||||
if(cantload || Blocks.size())
|
if(cantload || Blocks.size())
|
||||||
{
|
{
|
||||||
printf("DefScript: Error loading script '%s'\n",sn.c_str());
|
printf("DefScript: Error loading script '%s'. block mismatch?\n",sn.c_str());
|
||||||
DeleteScript(sn);
|
DeleteScript(sn);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -174,6 +174,9 @@ private:
|
|||||||
DefReturnResult func_or(CmdSet&);
|
DefReturnResult func_or(CmdSet&);
|
||||||
DefReturnResult func_xor(CmdSet&);
|
DefReturnResult func_xor(CmdSet&);
|
||||||
DefReturnResult func_substr(CmdSet&);
|
DefReturnResult func_substr(CmdSet&);
|
||||||
|
DefReturnResult func_uppercase(CmdSet&);
|
||||||
|
DefReturnResult func_lowercase(CmdSet&);
|
||||||
|
DefReturnResult func_random(CmdSet&);
|
||||||
// setup own function declarations here
|
// setup own function declarations here
|
||||||
# include "DefScriptInterfaceInclude.h"
|
# include "DefScriptInterfaceInclude.h"
|
||||||
|
|
||||||
|
|||||||
@ -413,12 +413,45 @@ DefReturnResult DefScriptPackage::func_xor(CmdSet& Set)
|
|||||||
DefReturnResult DefScriptPackage::func_substr(CmdSet& Set)
|
DefReturnResult DefScriptPackage::func_substr(CmdSet& Set)
|
||||||
{
|
{
|
||||||
DefReturnResult r;
|
DefReturnResult r;
|
||||||
unsigned int start,len;
|
if(Set.defaultarg.empty())
|
||||||
len=(unsigned int)toNumber(Set.arg[0]);
|
{
|
||||||
start=(unsigned int)toNumber(Set.arg[1]);
|
r.ret="";
|
||||||
if(start+len>Set.defaultarg.length())
|
}
|
||||||
len=Set.defaultarg.length()-start;
|
else
|
||||||
r.ret=Set.defaultarg.substr(start,len);
|
{
|
||||||
|
unsigned int start,len;
|
||||||
|
len=(unsigned int)toNumber(Set.arg[0]);
|
||||||
|
start=(unsigned int)toNumber(Set.arg[1]);
|
||||||
|
if(start+len>Set.defaultarg.length())
|
||||||
|
len=Set.defaultarg.length()-start;
|
||||||
|
r.ret=Set.defaultarg.substr(start,len);
|
||||||
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DefReturnResult DefScriptPackage::func_uppercase(CmdSet& Set)
|
||||||
|
{
|
||||||
|
DefReturnResult r;
|
||||||
|
r.ret=stringToUpper(Set.defaultarg);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
DefReturnResult DefScriptPackage::func_lowercase(CmdSet& Set)
|
||||||
|
{
|
||||||
|
DefReturnResult r;
|
||||||
|
r.ret=stringToLower(Set.defaultarg);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
DefReturnResult DefScriptPackage::func_random(CmdSet& Set)
|
||||||
|
{
|
||||||
|
DefReturnResult r;
|
||||||
|
int min,max;
|
||||||
|
min=(int)toUint64(Set.arg[0]);
|
||||||
|
max=(int)toUint64(Set.defaultarg);
|
||||||
|
r.ret=toString(ldbl( min + ( rand() % (max - min + 1)) ));
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -100,14 +100,37 @@ bool PseuInstance::Init(void) {
|
|||||||
_scp->variables.Set("@version",_ver);
|
_scp->variables.Set("@version",_ver);
|
||||||
_scp->variables.Set("@inworld","false");
|
_scp->variables.Set("@inworld","false");
|
||||||
|
|
||||||
log("Loading DefScripts from folder '%s'",_scpdir.c_str());
|
|
||||||
|
|
||||||
if(!_scp->BoolRunScript("_startup",NULL))
|
if(!_scp->BoolRunScript("_startup",NULL))
|
||||||
{
|
{
|
||||||
logerror("Error executing '_startup.def'");
|
logerror("Error executing '_startup.def'");
|
||||||
SetError();
|
SetError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// load all .def files in scripts directory
|
||||||
|
log("Loading DefScripts from folder '%s'",_scpdir.c_str());
|
||||||
|
std::deque<std::string> fl = GetFileList(_scpdir);
|
||||||
|
for(uint32 i = 0; i < fl.size(); i++)
|
||||||
|
{
|
||||||
|
std::string fn = fl[i]; // do not lowercase filename because of linux case sensitivity
|
||||||
|
if(fn.length() <= 4) // must be at least "x.def"
|
||||||
|
continue;
|
||||||
|
std::string ext = stringToLower(fn.substr(fn.length()-4,4));
|
||||||
|
std::string sn;
|
||||||
|
if(ext==".def")
|
||||||
|
sn = stringToLower(fn.substr(0,fn.length()-ext.length()));
|
||||||
|
if(sn.length())
|
||||||
|
{
|
||||||
|
if(!_scp->ScriptExists(sn))
|
||||||
|
{
|
||||||
|
std::string ffn = _scpdir + fn;
|
||||||
|
if(_scp->LoadScriptFromFile(ffn,sn))
|
||||||
|
logdebug("-> Auto-loaded script [ %s ]",ffn.c_str());
|
||||||
|
else
|
||||||
|
logerror("-> Can't auto-load script [ %s ]",ffn.c_str());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if(GetConf()->enablecli)
|
if(GetConf()->enablecli)
|
||||||
{
|
{
|
||||||
log("Starting CLI...");
|
log("Starting CLI...");
|
||||||
|
|||||||
@ -5,6 +5,13 @@
|
|||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "tools.h"
|
#include "tools.h"
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
# include <sys/dir.h>
|
||||||
|
# include <errno.h>
|
||||||
|
#else
|
||||||
|
# include <windows.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
void printchex(std::string in, bool spaces=true){
|
void printchex(std::string in, bool spaces=true){
|
||||||
unsigned int len=0,i;
|
unsigned int len=0,i;
|
||||||
len=in.length();
|
len=in.length();
|
||||||
@ -84,3 +91,46 @@ std::string toHexDump(uint8* array,uint32 size,bool spaces)
|
|||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::deque<std::string> GetFileList(std::string path)
|
||||||
|
{
|
||||||
|
std::deque<std::string> files;
|
||||||
|
|
||||||
|
# ifndef _WIN32 // TODO: fix this function for linux if needed
|
||||||
|
const char *p = path.c_str();
|
||||||
|
DIR * dirp;
|
||||||
|
struct dirent * dp;
|
||||||
|
dirp = opendir(p);
|
||||||
|
while (dirp)
|
||||||
|
{
|
||||||
|
errno = 0;
|
||||||
|
if ((dp = readdir(dirp)) != NULL)
|
||||||
|
files.push_back(std::string(dp->d_name));
|
||||||
|
else
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if(dirp)
|
||||||
|
closedir(dirp);
|
||||||
|
|
||||||
|
# else
|
||||||
|
|
||||||
|
if(path.at(path.length()-1)!='/')
|
||||||
|
path += "/";
|
||||||
|
path += "*.*";
|
||||||
|
const char *p = path.c_str();
|
||||||
|
WIN32_FIND_DATA fil;
|
||||||
|
HANDLE hFil=FindFirstFile(p,&fil);
|
||||||
|
if(hFil!=INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
files.push_back(std::string(fil.cFileName));
|
||||||
|
while(FindNextFile(hFil,&fil))
|
||||||
|
files.push_back(std::string(fil.cFileName));
|
||||||
|
}
|
||||||
|
|
||||||
|
# endif
|
||||||
|
|
||||||
|
while(files.front()=="." || files.front()=="..")
|
||||||
|
files.pop_front();
|
||||||
|
|
||||||
|
return files;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@ -15,5 +15,6 @@ std::string toString(uint64);
|
|||||||
std::string getDateString(void);
|
std::string getDateString(void);
|
||||||
uint64 toInt(std::string);
|
uint64 toInt(std::string);
|
||||||
std::string toHexDump(uint8* array,uint32 size,bool spaces=true);
|
std::string toHexDump(uint8* array,uint32 size,bool spaces=true);
|
||||||
|
std::deque<std::string> GetFileList(std::string);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user