Did stuff.

This commit is contained in:
Robert MacGregor 2012-08-17 20:48:47 -04:00
parent 09f43122e6
commit 8c96cba3e1
132 changed files with 56515 additions and 1448 deletions

View file

@ -0,0 +1,2 @@
These scripts are the internal functioning of the T2BoL mod. It is recommended you don't touch these and just use the BASIC API
to make your changes to the game.

View file

@ -0,0 +1,334 @@
//------------------------------------------------------------------------------
// Scripts/RPGBrowserGUI.cs
// One of the highlights of T2Bol.
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function RPGBrowserGui::onWake(%this)
{
if (RPGBrowserGui.pane $= "")
RPG_NewsPane.onActivate();
LaunchTabView.viewTab( "MOD BROWSER", RPGBrowserGui, 0 );
Canvas.pushDialog( LaunchToolbarDlg );
// This is essentially an "isInitialized" flag...
if ( RPG_TabView.tabCount() == 0 )
{
RPG_TabView.addSet(1, "gui/shll_horztabbuttonB", "5 5 5", "50 50 0", "5 5 5" );
RPG_TabView.addTab(1,"NEWS",1);
RPG_TabView.setSelected( 1 );
RPG_TabView.addTab(2,"ENCYCLOPEDIA");
RPG_TabView.addTab(3,"DOWNLOADS");
RPG_TabView.setTabActive(3,0);
}
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function RPGBrowserGui::onSleep(%this)
{
%ctrl = "RPG_" @ %this.pane @ "Pane";
if ( isObject( %ctrl ) )
%ctrl.onDeactivate();
}
//------------------------------------------------------------------------------
function BrowserDoSave() //A good ol' converter for browser files. Should work on ANY browser file. Including ones that you insert yourself.
{
%file = new fileObject();
%item = RPG_ItemList.getValue();
%category = RPG_Category.getValue();
%file.openForWrite("savedDocs/" @ %item @ ".txt");
%read = new fileObject();
%read.openForRead("Data/Browser/" @ %category @ "/" @ %item @ ".txt");
%skip = false;
while (!%read.isEOF())
{
%line = %read.readLine();
%lineTest = strLwr(strReplace(%line," ","")); //strip spaces to test for tags to skip
%spush = getSubStr(%lineTest,0,7);
%just = getSubStr(%lineTest,0,6);
//Ok.. we need to cipher out some useless information before we're through
if (%just !$= "<just:")
{
if (%spush $= "<spush>")
%skip = true;
if (%skip == true) //Try to find our <spop> tag
{
%search = strStr(%lineTest,"<spop>");
if (%search != -1)
%skip = false; //We found our <spop> tag, set %skip to false for the next turn
}
else //Otherwise the data is safe -- but we still got to look for my special <a:select> tag
{
%select = strStr(%lineTest,"<a:select");
if (%select != -1) //It exists -- we must convert it
{
%line = strReplace(%line,"-","\t"); //Apparently special tags don't work when read from a file, so the negative sign represents \t
%tag = strStr(%line,"<a:select"); //Find the position of my select tag
if (%tag != -1) //Ok, it exists. We need to grab our entire tag as a string
{
%start = strStr(%line,"<");
for (%i = 0; %i < strLen(%line); %i++)
{
%testC = getSubStr(%line, %i + %start, 3);
if (%testC $= "</a")
{
%end = %i;
break;
}
}
}
}
if (%line !$= "") //If the line is totally blank, don't do shit. Otherwise, attempt to space out the file (for easier read)
{
for (%i = 0; %i < strLen(%line); %i++) //Was up a little higher in the function; figured it should be moved down here
{
%test = getSubStr(%line,%i,9);
if (%test $= "<a:select") //We found a select tag.
{
%start = %i;
%end = strLen(%line) - strStr(%line,"</a>") - 3;
%test = getSubStr(%line,%start,%end);
%str = getWord(%test,0);
%line = strReplace(%line,%str,getNameFromSelectTag(%str));
}
}
for (%i = 0; %i < strLen(%line); %i++)
{
%sub = getSubStr(%line, %i, 1);
if (%sub $= ".") //Ok, we found a period. %i is where we are in the string. So we grab everything up until this period and move on
{
%file.writeLine(getSubStr(%line, 0, %i+1));
%line = getSubStr(%line, %i+1, strLen(%line));
}
}
}
}
}
}
//Detach our file objects (scripts/fileProcessing.cs)
%file.detach();
%read.detach();
messageBoxOk("SUCCESS","The contents of item "@%item@" in category "@%category@" have been saved. Check your mod Directory's sub-dir, /savedDocs for "@%item@".txt."); //YES! After all that the file should be good.
return true;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function getNameFromSelectTag(%string) //Since the tag should be directly inserted, there is no start.
{
%len = strLen(%string);
%start = strStr(%string,">");
%end = strStr(%string,"</a>");
%sub = getSubStr(%string,%start,%end);
%sub = stripTrailingSpaces(stripChars(strReplace(%sub,"</a>",""),">"));
return %sub;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function RPGBrowserGui::setKey( %this, %key )
{
// To avoid console error
}
//------------------------------------------------------------------------------
function RPGBrowserGui::onClose( %this, %key )
{
// To avoid console error
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// News pane:
//------------------------------------------------------------------------------
function RPG_NewsPane::onActivate(%this)
{
RPGBrowserGui.pane = "News";
}
//------------------------------------------------------------------------------
function RPG_NewsPane::onDeactivate(%this)
{
//RPGBrowserGui.pane = "News";
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Browser pane:
//------------------------------------------------------------------------------
function RPG_BrowserPane::onActivate(%this)
{
RPGBrowserGui.pane = "Browser";
RPG_Category.PopulateList();
//Make sure our DL button is properly placed (resolution may have changed)
RPG_DownloadButton.setPosition("5", getWord(Canvas.getExtent(), 1) - 163);
RPG_BrowserPane.refresh();
}
//------------------------------------------------------------------------------
function RPG_BrowserPane::Refresh(%this,%val)
{
//Ok, we must make the browser dynamic for convenience.
%text = RPG_Category.getText();
if (%text $= "Select Category" || %text $= "")
return RPG_Text.readFromFile("Data/Browser/Introduction.txt");
RPG_ItemList.clear();
%path = "Data/Game/" @ %text @ "/*.des";
%count = 0;
for( %file = findFirstFile( %path ); %file !$= ""; %file = findNextFile( %path ) )
{
%name = getFileNameFromString(strReplace(%file,".des","")); //Get the fileName from our string (used in the item List)
if (%name !$= "Introduction")
{
RPG_ItemList.addRow(%count, %name);
%count++;
}
}
RPG_ItemList.sortNumerical(0,0); //Sort the items from A-Z
//RPG_ItemList.setSelectedRow(RPG_ItemList.findTextIndex($Browser::SelectedText));
RPG_ItemList.setSelectedRow(RPGBrowserGUI.selectedID[%text]);
}
//------------------------------------------------------------------------------
function RPG_BrowserPane::onDeactivate(%this)
{
//RPGBrowserGui.pane = "Browser";
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Downloads pane:
//------------------------------------------------------------------------------
function RPG_DownloadsPane::onActivate(%this)
{
RPGBrowserGui.pane = "Downloads";
}
//------------------------------------------------------------------------------
function RPG_DownloadsPane::onDeactivate(%this)
{
//RPGBrowserGui.pane = "Downloads";
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function RPG_TabView::onSelect( %this, %id, %text )
{
RPG_BrowserPane.setVisible( %id == 2 );
RPG_NewsPane.setVisible( %id == 1 );
%ctrl = "RPG_" @ RPGBrowserGui.pane @ "Pane";
if ( isObject( %ctrl ) )
%ctrl.onDeactivate();
switch ( %id )
{
case 1: // News
RPG_NewsPane.onActivate();
case 2: // Encyclopedia
RPG_BrowserPane.onActivate();
case 3: // Downloads
RPG_DownloadsPane.onActivate();
}
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function RPG_Category::PopulateList() //Listing is now alphabatized
{
RPG_Category.clear();
%file = "Data/Game/encyclopediaData.txt";
%count = getBlockData(%file,"Encyclopedia",1,"categoryCount");
RPG_Category.count = %count;
for (%i = 0; %i < %count; %i++)
{
%category = getBlockData(%file,"Encyclopedia",1,"category" @ %i);
RPG_Category.add(%category,%i);
}
if (RPG_Category.selected !$= "") //Fixes the category dropdown resetting
RPG_Category.setSelected(RPG_Category.selected);
else
RPG_Category.setValue("Select Category");
//Force the browser to have an introduction.
RPG_Text.readFromFile("Data/Game/Encyclopedia_Intro.des");
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function RPG_Category::onSelect(%this, %id, %text)
{
RPG_ItemList.clear();
RPG_Text.setValue("");
RPG_Category.selected = %id;
RPG_Text.readFromFile("Data/Game/" @ %text @ "/Introduction.des"); //Display the intro for the category we selected
RPG_BrowserPane.refresh();
if (RPG_ItemList.getSelectedID() == -1) //Does our button really need to be inactive?
RPG_DownloadButton.setActive(false); //YES!
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function RPG_ItemList::onSelect(%this, %id, %text)
{
$Browser::SelectedText = %text;
RPG_DownloadButton.setActive(true);
%category = RPG_Category.getvalue();
RPGBrowserGUI.selectedID[%category] = %id;
RPG_Text.readFromFile("Data/Game/" @ %category @ "/" @ %text @ ".des");
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function RPG_Text::readFromFile(%this,%file)
{
RPG_Text.setValue(""); //Clear the info, for some odd reason .clear() won't work..
if (!IsFile(%file))
return -1;
%fileobj = new FileObject();
%fileobj.openForRead(%file);
while (!%fileobj.isEOF())
{
%line = %fileobj.readLine() @ "\n";
RPG_Text.addText(%line,1);
}
%fileobj.detach();
}
//------------------------------------------------------------------------------
RPG_DownloadButton.setActive(false); //Eh.. for some reason setting isActive in the GUI file isn't working

View file

@ -0,0 +1,9 @@
//------------------------------------------------------------------------------
// initialise.cs
// Client Scripts Init
// Copright (c) 2012 The DarkDragonDX
//==============================================================================
exec("scripts/modScripts/client/clientFunctions.cs");
exec("scripts/modScripts/client/serverRequestHandler.cs");
exec("scripts/modScripts/client/RPGBrowserGUI.cs");

View file

@ -0,0 +1,349 @@
//------------------------------------------------------------------------------
// HTTPServer.cs
// An experimental HTTP Server written in Torque!
// Copyright (c) 2012 The DarkDragonDX
//------------------------------------------------------------------------------
// --
// BoL Specific Code -- automatically load the server if enabled
if (!IsObject(HTTPServerPrefs))
new ScriptObject(HTTPServerPrefs) { class = "BasicDataParser"; };
HTTPServerPrefs.empty();
HTTPServerPrefs.load("prefs/WebServer.conf");
%generic = HTTPServerPrefs.get("Generic",0);
if(%generic.element("Enabled") $= "true")
{
new ScriptObject(WebServer) { class = "HTTPServer"; };
WebServer.listen(%generic.element("Host"),%generic.element("Port"),%generic.element("StartWorkers"));
}
// --
// Replicate Code for Servers
$HTTPServer::ServerReplicate = "function *UNIQUESOCKET*::onConnectRequest(%this, %address, %socket)\n" @
"{\n" @
"%this.Parent.connectionCreated(%address, %socket);\n" @
"return true;\n" @
"}\n";
// Replicate Code for Clients
$HTTPServer::ClientReplicate = "function *UNIQUESOCKET*::onLine(%this, %line)\n" @
"{\n" @
"%this.Parent.onLine(%this, %line);\n" @
"return true;\n" @
"}\n" @
"function *UNIQUESOCKET*::onDisconnect(%this) { %this.Parent.connectionDropped(%this); return true; }\n" @
"function *UNIQUESOCKET*::sendPacket(%this,%packet)\n" @
"{\n" @
"%this.send(%packet.statusCode);\n" @
"for (%i = 0; %i < %packet.headerCount; %i++)\n" @
"{\n" @
"echo(%packet.headers[%packet.headerName[%i]]);\n" @
"%this.send(%packet.headers[%packet.headerName[%i]]);\n" @
"}\n" @
"%this.send(\"\\n\");\n" @
"%this.send(%packet.payLoad);\n" @
"%this.disconnect();\n" @
"}\n";
function HTTPServer::listen(%this, %address, %port, %maxClients)
{
%uniqueNameLength = 6; // Adjust this if need be, but there should never be a reason to
%this.allowMultiConnect = false; // If false, when a client connects twice, its old connection is killed and replaced with a new one.
if (%this.isListening)
return false;
if (%maxClients < 1 || %maxClients == 0)
%maxClients = 8;
%oldAddr = $Host::BindAddress;
%address = strlwr(%address);
if (%address $= "local" || %address $="localhost" ) %address = "127.0.0.1";
else if (%address $= "any") %address = "0.0.0.0";
%charList = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// Generate A name for a TCPObject (and make sure it's unique)
%uniqueStringLen = 6; // Adjust this if needed, but there shouldn't be a reason to
%uniqueString = "";
while (true)
{
%uniqueString = generateString(%uniqueNameLength, %charList);
if (!isObject(%uniqueString)) break;
else %uniqueString = "";
}
%evalCode = $HTTPServer::ServerReplicate;
%evalCode = strReplace(%evalCode, "*UNIQUESOCKET*", %uniqueString);
eval(%evalCode);
// Generate a list of unique names that this TCPServer will use (to keep down function def count)
for (%i = 0; %i < %maxClients; %i++)
while (true)
{
%uniqueName = generateString(%uniqueNameLength, %charList);
if (!isObject(%uniqueName))
{
%eval = strReplace($HTTPServer::ClientReplicate, "*UNIQUESOCKET*", %uniqueName);
eval(%eval);
%this.uniqueName[%i] = %uniqueName;
%this.uniqueNameInUse[%uniqueName] = false;
break;
}
}
// Create the Socket and we'll rock n' roll
$Host::BindAddress = %address;
%this.Server = new TCPObject(%uniqueString);
%this.Server.listen(%port);
%this.Server.Parent = %this;
%this.connectionCount = 0;
%this.maximumClients = %maxClients;
$Host::BindAddress = %oldAddr;
%this.isListening = true;
%statusCodes = HTTPServerPrefs.get("StatusCodes",0);
%this.Page[404] = %statusCodes.element("404");
%this.Page[403] = %statusCodes.element("403");
%generic = HTTPServerPrefs.get("Generic",0);
%this.Root = %generic.element("Root");
%this.Variables = Array.create();
%this.MimeTypes = HTTPServerPrefs.get("MIME");
logEcho("Server " @ %uniqueString SPC "is ready on " @ %address @ ":" @ %port);
return true;
}
function HTTPServer::disconnect(%this)
{
}
function HTTPServer::connectionDropped(%this, %socket)
{
if (!IsObject(%socket))
return false;
%socket.disconnect();
if (!%this.allowMultiConnect)
%this.connections[%socket.Address] = "";
else
%this.connections[%socket.Address, %socket.Port] = "";
%this.uniqueNameInUse[%socket.getName()] = false;
%this.connectionCount--;
%this.onClientDisconnect(%socket);
}
function HTTPServer::connectionCreated(%this, %address, %socket)
{
%isReplicate = false;
// Get the Port No. and Address respectively
%address = strReplace(%address, "IP:","");
%portPos = strStr(%address, ":");
%port = getSubStr(%address, %portPos+1, strLen(%address));
%address = getSubStr(%address, 0, %portPos);
// Pick a unique name
%uniqueName = "";
for (%i = 0; %i < %this.maximumClients; %i++)
{
%name = %this.uniqueName[%i];
if (!%this.uniqueNameInUse[%name])
{
%uniqueName = %name;
%this.uniqueNameInUse[%name] = true;
break;
}
}
// If we were unable to find a good unique name
%charList = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
%uniqueStringLen = 6; // Adjust this if needed, but there shouldn't be a reason to
if (%uniqueName $= "")
{
while (true)
{
%uniqueName = generateString(%uniqueStringLen, %charList);
if (!isObject(%uniqueName)) break;
else %uniqueName = "";
}
%eval = strReplace($HTTPServer::ClientReplicate, "*UNIQUESOCKET*", %uniqueName);
eval(%eval);
%this.uniqueName[%this.maximumClients] = %uniqueName;
%this.uniqueNameInUse[%uniqueName] = true;
%this.maximumClients++;
}
// Create The Client Socket
%connection = new TCPObject(%uniqueName,%socket) { class = ConnectionTCP; parent = %this; Address = %address; Port = %port; };
if (!%this.allowMultiConnect)
%this.connections[%address] = %connection;
else
%this.connections[%address, %port] = %connection;
%this.connectionCount++;
%this.onClientConnect(%address, %connection);
logEcho("Received client connection from " @ %address);
%this.schedule(10000,"connectionDropped",%connection);
return true;
}
// Callbacks -- make these do whatever you please!
function HTTPServer::onClientConnect(%this, %address, %socket)
{
echo("Received connection from " @ %address @ ". ID:" @ %socket);
//%socket.disconnect();
return true;
}
function HTTPServer::onClientRejected(%this, %socket, %reason) // %reason is always zero as of now.
{
return true;
}
function HTTPServer::onClientDisconnect(%this, %socket)
{
logEcho("Received Disconnect (" @ %socket @ ")");
%socket.delete();
return true;
}
function HTTPServer::onLine(%this, %socket, %line)
{
logEcho(%socket SPC "says: " @ %line);
%reqType = getWord(%line, 0);
if (%reqType $= "GET")
{
%req = getWord(%line, 1);
%reqLen = strLen(%req);
%socket.request = getSubStr(%req, 1, %reqLen);
%socket.request = strReplace(%socket.request, "%20", " ");
%socket.request = %this.Root @ %socket.request;
%socket.requestType = "GET";
}
%data = "<HTML><header><title>404 - Not Found</title></header><body>Oops!<br>File not found.</body></HTML>";
%forbiddenData = "<HTML><header><title>403- Forbidden</title></header><body>Oops!<br>You're not allowed to see this.</body></HTML>";
%packet = new ScriptObject(){ class = "HTTPResponsePacket"; };
//return;
// We received the end-of-packet from a socket
if (%line $= "")
{
//Shitty
if (strStr(%socket.request,".") != -1)
{
if (!isFile(%socket.request))
%packet.setStatusCode(404);
else if (%socket.request $= "prefs/ClientPrefs.cs")
{
%packet.setStatusCode(403);
%data = %forbiddenData;
}
else
{
%packet.setStatusCode(200);
%file = new FileObject();
%file.openForRead(%socket.request);
%data = "";
while (!%file.isEOF())
{
%line = %file.readLine();
echo(%line);
if (strStr(%socket.request,".html") == -1)
{
%line = strReplace(%line,">","&#62;");
%line = strReplace(%line,"<","&#60;");
%line = strReplace(%line," ","&nbsp;");
%line = strReplace(%line,"\t","&nbsp;&nbsp;&nbsp;&nbsp;");
%data = %data @ %line @ "<br>\n";
}
else
%data = %data @ %line @ "\n";
}
%file.close();
%file.delete();
}
// Check the file type
%extension = getFileExtensionFromString(%socket.request);
if (%extension $= "html" || %extension $= "htm")
{
%script = strReplace(%socket.request,".html",".cs");
if (isFile(%script))
{
exec(%script);
%Object = new ScriptObject(){ class = "ServerApp"; };
%data = %Object.execute(%data);
%Object.delete();
}
}
}
else
{
%packet.setStatusCode(200);
%data = "<HTML>\n<header>\n<title>\nDirectory\n</title>\n</header>\n<body><h1>Directory of " @ %socket.request @ "</h1>\n";
for( %file = findFirstFile( %socket.request @ "*.*" ); %file !$= ""; %file = findNextFile( %socket.request @ "*.*" ) )
{
%file = strReplace(%file, %socket.request, "");
if (strStr(%file, "/") != -1)
{
%dir = getSubStr(%file, 0, strStr(%file, "/")) @ "/";
if (!%dirAdded[%dir])
{
%data = %data @ "<a href=\"" @ strReplace(%dir, " ","%20") @ "\">" @ %dir @ "</a><br>\n";
%dirAdded[%dir] = true;
}
}
else
%data = %data @ "<a href=\"" @ strReplace(%file, " ", "%20") @ "\">" @ %file @ "</a><br>\n";
}
%data = %data @ "</body>\n</HTML>\n";
}
%packet.setHeader("Date",formatTimeString("DD, dd MM yy hh:nn:ss ") @ "Eastern");
%packet.setHeader("Server","Tribes 2");
%packet.setHeader("Content-Type","text/html");
%packet.setPayload(%data);
%socket.sendPacket(%packet);
%packet.delete();
%this.connectionDropped(%socket);
}
if (isObject(%packet))
%packet.delete();
return true;
}
// Packet Functions (used for packet generation/reading)
function HTTPResponsePacket::setHeader(%this, %name, %value)
{
if (%this.headerCount == "")
%this.headerCount = 0;
if (%this.headers[%name] $= "")
{
%this.headerName[%this.headerCount] = %name;
%this.headerCount++;
}
%this.headers[%name] = %name @ ": " @ %value @ "\n";
return true;
}
function HTTPResponsePacket::setStatusCode(%this, %code)
{
%this.statusCode = "HTTP/1.1 " @ %code SPC "OK\n";
return true;
}
function HTTPResponsePacket::setPayload(%this, %data)
{
%this.payLoad = %data;
%this.payloadSize = strLen(%data);
%this.setHeader("Content-Length", %this.payloadSize);
return true;
}
// Lib Functions
function generateString(%length, %alpha)
{
%len = strLen(%alpha);
%result = "";
for (%i = 0; %i < %length; %i++)
%result = %result @ getSubStr(%alpha, getRandom(0, %len), 1);
return %result;
}

View file

@ -0,0 +1,81 @@
//------------------------------------------------------------------------------
// Application SDK for the PDA. (to make my life easier)
// Trigger code for RPG Gamemode
// Copyright (c) 2012 The DarkDragonDX
//==============================================================================
function RPGGame::onEnterTrigger(%game, %name, %data, %obj, %colObj)
{
switch$(%obj.type)
{
case "Transport": if (%obj.targetTransform $= "") return;
%Colobj.setTransform(%obj.targetTransform);
if (%Colobj.Usewhiteout)
%Obj.setWhiteout(0.8);
break;
case "Territory":
if (%obj.race $= "")
return;
%obj.client.isOnTerritory[%Colobj.race] = true;
setClientTeam(%Colobj.client,getRaceTeam(%Obj.race));
if (%obj.location $= "")
{
messageClient(%Colobj.client,'MsgSPCurrentObjective1',"",'Location: %1.', %obj.race SPC "Territory");
messageClient(%colObj.client,'msgEnteredRaceTerritory','\c3You have entered %1 territory.',%obj.race);
}
else
{
messageClient(%colObj.client,'msgEnteredRaceTerritory','\c3You have entered %1.',%obj.location);
messageClient(%Colobj.client,'MsgSPCurrentObjective1',"",'Location: %1.', %obj.location);
}
break;
case "Damage": //Will add lots o' vars onto it..
%obj.damage[%colobj] = true;
%colObj.isinLava = true;
break;
}
if (%Colobj.message $= "" && %Colobj.type !$= "Territory")
messageClient(%Colobj.client,'MsgTrigger',%obj.message);
return true;
}
function RPGGame::onLeaveTrigger(%game, %name, %data, %obj, %colObj)
{
switch$(%obj.type)
{
case "Territory":
if (%obj.race $= "")
return;
if (%obj.location $= "")
messageClient(%Colobj.client,'MsgExitedRaceTerritory',"\c3You have exited "@%obj.race@" territory. Your sensor data is now undetectable.");
else
messageClient(%Colobj.client,'MsgExitedRaceTerritory',"\c3You have exited "@%obj.location@".");
%Colobj.client.isOnTerritory[%obj.race] = false;
messageClient(%colObj.client,'MsgSPCurrentObjective1',"",'Location: Unknown.');
setClientTeam(%Colobj.client,0); //Not on the sensor, I think
break;
case "Damage":
%obj.damage[%obj] = false;
%colObj.isInLava = true;
break;
}
return true;
}
function RPGGame::onTickTrigger(%game, %name, %data, %obj)
{
switch(%obj.type)
{
case "Damage":
for (%i = 0; %i < MissionCleanup.getCount(); %i++)
{
%objT = MissionCleanup.getObject(%i);
if (%objt.getClassName() $= "Player" && %objt.getState() $= "move")
if (%obj.damage[%objT] && %objT.isInLava)
%objT.damage(0, %objT.getPosition(), %obj.damage, %obj,damageType);
break;
}
}
return true;
}

View file

@ -0,0 +1,32 @@
//------------------------------------------------------------------------------
// PDAApplication.cs
// Application SDK for the PDA. (to make my life easier)
// Copyright (c) 2012 The DarkDragonDX
//==============================================================================
function PDAApplication::main(%this, %client)
{
}
function PDAApplication::action(%this, %client, %page)
{
}
function PDAApplication::exit(%this, %client, %page)
{
}
// API Functions
function PDAApplication::setTitle(%this, %title)
{
// Won't do anything for now because the title is a clientside thing, actually.
}
function PDAApplication::cls(%this)
{
}
// The script parses <URL=
function PDAApplication::setLine(%this, %lineNo, %columnStart, %data)
{
}

View file

@ -0,0 +1,106 @@
//Component: Lootage
//Description: You can loot corpses. (w00t)
//----------------------------------------------------------------------------
// DATABLOCKS
//----------------------------------------------------------------------------
datablock ItemData(Lootbag)
{
className = Weapon;
catagory = "Misc";
shapeFile = "moneybag.dts";
mass = 1;
elasticity = 0.2;
friction = 50;
pickupRadius = 2;
pickUpPrefix = "a bag of items";
alwaysAmbient = true;
description = "lootbag_model";
computeCRC = false;
emap = true;
};
//----------------------------------------------------------------------------
// BOUND FUNCTIONS
//----------------------------------------------------------------------------
//Realized this isn't required..
//function LootBag::onAdd(%this,%obj) //Force a loot check on creation.
//{
//LootBagCheckForPickUp(%obj);
//parent::onAdd(%this,%obj);
//}
//----------------------------------------------------------------------------
// FUNCTIONS
//----------------------------------------------------------------------------
function LootBagCheckForPickUp(%this) //Not sure why, loot bags won't do a T2 system pickup..
{
cancel(%this.loop);
if (!IsObject(%this))
return;
%count = MissionCleanUp.getCount();
for(%i = 0; %i < %count; %i++)
{
%test = MissionCleanUp.getObject(%i);
if (%test.getClassName() $= "Player" && %test.getState() !$= "dead" && !%test.client.isAIControlled())
{
%dist = vectorDist(%this.getPosition(),%test.getPosition());
if (%dist < %this.getDatablock().pickUpRadius)
{
LootBagPickedUp(%this,%test.client);
return;
}
%this.loop = schedule(100,0,"LootBagCheckForPickup",%this);
}
}
}
function LootBagPickedUp(%this,%client)
{
%db = %client.player.getDatablock(); //The player's datablock
%money = %this.money; //Monies?
%numItems = %this.numItems; //Giving out items.
%numAmmo = %this.numAmmo; //..Ammo too!
//Does the bag have money?
if (%money $= "")
%hasMoney = false;
else
%hasMoney = true;
if (%money !$= "")
%client.money = %client.money + %money; //Give some monies.
for (%i = 0; %i < %numItems; %i++)
{
if (%db.max[%this.item[%i]] != 0) //Don't want people in light armor running around with mortars, do we?
{
%client.player.setInventory(%this.item[%i],1);
%client.player.setInventory(%this.ammo[%i],%this.ammoNum[%i]);
}
}
%this.delete(); //Delete the bag.
//Let the player know.
switch (%hasMoney)
{
case 0:
if (%numItems > 1)
messageClient(%client,'MsgClient','You picked up a bag of items that contained %1 items.',%numitems);
else
messageClient(%client,'MsgClient','You picked up a bag of items that contained 1 item.');
case 1:
if (%numItems > 1)
messageClient(%client,'MsgClient','You picked up a bag of items that contained $%1 and %2 items.',%money,%numitems);
else
messageClient(%client,'MsgClient','You picked up a bag of items that contained $%1 and 1 item.',%money);
}
}

View file

@ -0,0 +1,38 @@
// -----------------------------------------------------
// Datablocks
// Note: You can't actually target interiors with beams,
// so make an interior and put this box around it.
// -----------------------------------------------------
datablock StaticShapeData(MiningBox) : StaticShapeDamageProfile {
className = "MineBox";
shapeFile = "Pmiscf.dts";
maxDamage = 5000;
destroyedLevel = 0;
disabledLevel = 0;
isShielded = false;
energyPerDamagePoint = 240;
dynamicType = $TypeMasks::StaticShapeObjectType;
deployedObject = true;
cmdCategory = "DSupport";
cmdIcon = CMDSensorIcon;
cmdMiniIconName = "commander/MiniIcons/com_deploymotionsensor";
targetNameTag = 'Mining Detection Box';
deployAmbientThread = true;
debrisShapeName = "debris_generic_small.dts";
debris = DeployableDebris;
heatSignature = 0;
needsPower = false;
};
// -----------------------------------------------------
// Code
// Note: Weapon code is in weapons/miningTool.cs
// -----------------------------------------------------
function MiningBox::onAdd(%this, %obj)
{
%obj.startFade(1,0,1);
%obj.applyDamage(%obj.getDataBlock().maxDamage); //Start the rock off
}

View file

@ -0,0 +1,193 @@
// --------------------------------------------------------
// A script that allows one to buy property.
// The script is in a BETA state, so it may have bugs.
//
// TODO:
// Make the script take rotation into consideration..
// Find a way to 'purchase' interiors
// --------------------------------------------------------
function InteriorInstance::buyObject(%this,%objectID,%client,%team)
{
if (%this.generatorCount $= "")
%this.generatorCount = 0;
if (%this.inventoryCount $= "")
%this.inventoryCount = 0;
if (%this.sensorCount $= "")
%this.sensorCount = 0;
if (%this.sentryCount $= "")
%this.sentryCount = 0;
if (%this.bannerCount $= "")
%this.bannerCount = 0;
if (%this.turretBaseCount $= "")
%this.turretBaseCount = 0;
switch(%objectID)
{
case 0: //Generator
if (%this.generatorCount == $Property::Max[%this.interiorFile,0])
return false;
%shape = new StaticShape()
{
DataBlock = GeneratorLarge;
Position = vectorAdd($Property::Offset[%this.interiorFile,0,%this.generatorCount],%this.getPosition());
Rotation = $Property::Rotation[%this.interiorFile,0,%this.generatorCount];
Team = %team;
};
GeneratorLarge.gainPower(%shape);
%this.generatorCount++;
case 1: //Inventory
if (%this.generatorCount == 0 || %this.inventoryCount == $Property::Max[%this.interiorFile,1]) //Don't create if there's no generators
return false;
%shape = new StaticShape()
{
DataBlock = StationInventory;
Position = vectorAdd($Property::Offset[%this.interiorFile,1,%this.inventoryCount],%this.getPosition());
Rotation = $Property::Rotation[%this.interiorFile,1,%this.inventoryCount];
Team = %team;
};
StationInventory.gainPower(%shape);
%this.inventoryCount++;
case 2: //Sensor (Medium)
if (%this.generatorCount == 0 || %this.sensorCount == $Property::Max[%this.interiorFile,2])
return false;
%shape = new StaticShape()
{
DataBlock = SensorMediumPulse;
Position = vectorAdd($Property::Offset[%this.interiorFile,2,%this.sensorCount],%this.getPosition());
Rotation = $Property::Rotation[%this.interiorFile,2,%this.sensorCount];
Team = %team;
};
SensorMediumPulse.gainPower(%shape);
%this.sensorCount++;
case 3: //Sensor (Large)
if (%this.generatorCount == 0 || %this.sensorCount == $Property::Max[%this.interiorFile,2])
return false;
%shape = new StaticShape()
{
DataBlock = SensorLargePulse;
Position = vectorAdd($Property::Offset[%this.interiorFile,3,%this.sensorCount],%this.getPosition());
Rotation = $Property::Rotation[%this.interiorFile,3,%this.sensorCount];
Team = %team;
};
SensorLargePulse.gainPower(%shape);
%this.sensorCount++;
case 4: //Sentry Turrets
if (%this.generatorCount == 0 || %this.sentryCount == $Property::Max[%this.interiorFile,4])
return false;
%shape = new StaticShape()
{
DataBlock = SentryTurret;
Position = vectorAdd($Property::Offset[%this.interiorFile,4,%this.sentryCount],%this.getPosition());
Rotation = $Property::Rotation[%this.interiorFile,4,%this.sentryCount];
Team = %team;
};
SentryTurret.gainPower(%shape);
%this.sentryCount++;
case 5: //Banner (Strength)
if (%this.bannerCount == $Property::Max[%this.interiorFile,5])
return false;
%shape = new StaticShape()
{
DataBlock = Banner_Strength;
Position = vectorAdd($Property::Offset[%this.interiorFile,5,%this.bannerCount],%this.getPosition());
Rotation = $Property::Rotation[%this.interiorFile,5,%this.bannerCount];
Team = %team;
};
%this.bannerCount++;
case 6: //Large Turret Base
if (%this.generatorCount == 0 || %this.turretBaseCount == $Property::Max[%this.interiorFile,6])
return false;
%shape = new StaticShape()
{
DataBlock = TurretBaseLarge;
Position = vectorAdd($Property::Offset[%this.interiorFile,6,%this.turretBaseCount],%this.getPosition());
Rotation = $Property::Rotation[%this.interiorFile,6,%this.turretBaseCount];
Team = %team;
};
%this.turretBaseCount++;
}
%this.getGroup().add(%shape);
setTargetName(%shape.target,addTaggedString(%client.namebase @ "'s"));
setTargetSensorGroup(%shape.getTarget(), %team);
%shape.setSelfPowered();
return %shape;
}
function staticShape::setPosition(%this,%pos)
{
%this.setTransform(%pos);
return %this;
}
function staticShape::getRotation(%this)
{
%trans = %this.getTransform();
return getWord(%trans, 3) SPC getWord(%trans, 4) SPC getWord(%trans,5);
}
function objectIDToDatablock(%objectID)
{
switch(%objectID)
{
case 0: return "GeneratorLarge";
case 1: return 0;
default: return -1;
}
return -1;
}
//This the array that stores all the positions and rotations for purchases of objects. I'll eventually move this to be a part of the basicFileProcessing.
//Beagle Tower (bbunk2)
//Generators
$Property::Offset["bbunk2.dif",0,0] = "0.136109 6.92569 3.80877";
$Property::Rotation["bbunk2.dif",0,0] = "1 0 0 0";
//Inventory
$Property::Offset["bbunk2.dif",1,0] = "-13.5045 6.57603 -6.49712";
$Property::Rotation["bbunk2.dif",1,0] = "0 0 -1 88.8085";
$Property::Offset["bbunk2.dif",1,1] = "13.5045 6.57603 -6.49712";
$Property::Rotation["bbunk2.dif",1,1] = "0 0 1 88.8085";
//Medium Sensors
$Property::Offset["bbunk2.dif",2,0] = "-0.0187805 3.42132 30.8251";
$Property::Rotation["bbunk2.dif",2,0] = "1 0 0 0";
//Large Sensors
$Property::Offset["bbunk2.dif",3,0] = "-0.0187805 3.42132 30.8251";
$Property::Rotation["bbunk2.dif",3,0] = "1 0 0 0";
//Sentry Turrets
$Property::Offset["bbunk2.dif",4,0] = "0.018325 -0.513021 9.99179";
$Property::Rotation["bbunk2.dif",4,0] = "0.706825 0.707389 0.000371874 179.92";
$Property::Offset["bbunk2.dif",4,1] = "-0.092863 10.5404 -0.443447";
$Property::Rotation["bbunk2.dif",4,1] = "0.577209 -0.577449 -0.577392 119.938";
//Banners (Strength)
$Property::Offset["bbunk2.dif",5,0] = "-0.150952 9.53516 9.82968";
$Property::Rotation["bbunk2.dif",5,0] = "0 0 1 179.909";
//Large Turret Base
$Property::Offset["bbunk2.dif",6,0] = "0.0332212 11.5991 27.9961";
$Property::Rotation["bbunk2.dif",6,0] = "1 0 0 0";
//Max values for each interior
$Property::Max["bbunk2.dif",0] = 1; //Max generators
$Property::Max["bbunk2.dif",1] = 2; //Max Inventories
$Property::Max["bbunk2.dif",2] = 1; //Max Medium Sensors
$Property::Max["bbunk2.dif",3] = 1; //Max Large Sensors
$Property::Max["bbunk2.dif",4] = 2; //Max Sentry Turrets
$Property::Max["bbunk2.dif",5] = 1; //Max Banners (Strength)
$Property::Max["bbunk2.dif",6] = 1; //Max Turret Bases

View file

@ -0,0 +1,49 @@
//------------------------------------------------------------------------------
// scripts/modScripts/server/serverNetworking.cs
//------------------------------------------------------------------------------
if (!IsObject(ServerNetwork))
new TCPObject(ServerNetwork);
function ServerNetwork::onConnect(%this)
{
}
function ServerNetwork::onConnectFailed(%this)
{
if (%this.testingServer)
{
error("Error: Unable to verify connection to server "@%this.testIP@" at port "@%this.testPort@"!");
%this.testIP = "";
%this.testPort = "";
%this.testingServer = false;
}
}
function ServerNetwork::onDisconnect(%this)
{
}
function ServerNetwork::onDisconnectFailed(%this)
{
}
function ServerNetwork::listen(%this)
{
}
function ServerNetwork::send(%this)
{
}
function ServerNetwork::onLine(%this, %line)
{
}
function ServerNetwork::testServerIP(%this, %IP, %port)
{
%this.testingServer = true;
%this.testIP = %ip;
%this.testPort = %port;
%this.connect(%ip @ ":" @ %port);
}

View file

@ -0,0 +1,175 @@
//------------------------------------------------------------------------------
// TCPServer.cs
// Needed this type of thing for communication between servers in the game,
// so after some googling -- this is what I put out.
// forum.blockland.us/index.php?topic=105360
// Copyright (c) 2012 The DarkDragonDX
//------------------------------------------------------------------------------
// Replicate Code for Servers
$TCPServer::ServerReplicate = "function *UNIQUESOCKET*::onConnectRequest(%this, %address, %socket)" @
"{" @
"%this.Parent.connectionCreated(%address, %socket); " @
"return true;" @
"}";
// Replicate Code for Clients
$TCPServer::ClientReplicate = "function *UNIQUESOCKET*::onLine(%this, %line)" @
"{" @
"%this.Parent.onLine(%this, %line);" @
"return true;" @
"}" @
"function *UNIQUESOCKET*::onDisconnect(%this) { %this.Parent.connectionDropped(%this); return true; }";
function TCPServer::listen(%this, %address, %port, %maxClients)
{
%uniqueNameLength = 6; // Adjust this if need be, but there should never be a reason to
%this.allowMultiConnect = false; // If false, when a client connects twice, its old connection is killed and replaced with a new one.
if (%this.isListening)
return false;
if (%maxClients < 1 || %maxClients == 0)
%maxClients = 8;
%oldAddr = $Host::BindAddress;
%address = strlwr(%address);
if (%address $= "local" || %address $="localhost" ) %address = "127.0.0.1";
else if (%address $= "any") %address = "0.0.0.0";
%charList = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
// Generate A name for a TCPObject (and make sure it's unique)
%uniqueStringLen = 6; // Adjust this if needed, but there shouldn't be a reason to
%uniqueString = "";
while (true)
{
%uniqueString = generateString(%uniqueNameLength, %charList);
if (!isObject(%uniqueString)) break;
else %uniqueString = "";
}
%evalCode = $TCPServer::ServerReplicate;
%evalCode = strReplace(%evalCode, "*UNIQUESOCKET*", %uniqueString);
eval(%evalCode);
// Generate a list of unique names that this TCPServer will use (to keep down function def count)
for (%i = 0; %i < %maxClients; %i++)
while (true)
{
%uniqueName = generateString(%uniqueNameLength, %charList);
if (!isObject(%uniqueName))
{
%eval = strReplace($TCPServer::ClientReplicate, "*UNIQUESOCKET*", %uniqueName);
eval(%eval);
%this.uniqueName[%i] = %uniqueName;
%this.uniqueNameInUse[%uniqueName] = false;
break;
}
}
// Create the Socket and we'll rock n' roll
$Host::BindAddress = %address;
%this.Server = new TCPObject(%uniqueString);
%this.Server.listen(%port);
%this.Server.Parent = %this;
%this.connectionCount = 0;
%this.maximumClients = %maxClients;
$Host::BindAddress = %oldAddr;
%this.isListening = true;
logEcho("Server " @ %uniqueString SPC "is ready on " @ %address @ ":" @ %port);
return true;
}
function TCPServer::disconnect(%this)
{
}
function TCPServer::connectionDropped(%this, %socket)
{
if (!%this.allowMultiConnect)
%this.connections[%socket.Address] = "";
else
%this.connections[%socket.Address, %socket.Port] = "";
%this.connectionCount--;
%this.onClientDisconnect(%socket);
}
function TCPServer::connectionCreated(%this, %address, %socket)
{
%isReplicate = false;
// Get the Port No. and Address respectively
%address = strReplace(%address, "IP:","");
%portPos = strStr(%address, ":");
%port = getSubStr(%address, %portPos+1, strLen(%address));
%address = getSubStr(%address, 0, %portPos);
if (!%this.allowMultiConnect && %this.connections[%address] != 0)
{
%this.connections[%address].disconnect();
%this.connections[%address].delete();
%isReplicate = true;
}
if (%this.connectionCount >= %this.maximumClients)
{
// Create the connection so we can disconnect it *lol*
%connection = new TCPObject(%uniqueName,%socket) { class = ConnectionTCP; parent = %this; Address = %address; Port = %port; };
%this.onClientRejected(%connection, 0);
logEcho("Unable to accept connection from " @ %address SPC " -- already at maximum client count! (" @ %this.maximumClients @ ")");
%connection.disconnect();
%connection.delete();
return false;
}
// Pick a unique name
%uniqueName = "";
for (%i = 0; %i < %this.maximumClients; %i++)
{
%name = %this.uniqueName[%i];
if (!%this.uniqueNameInUse[%name])
{
%uniqueName = %name;
%this.uniqueNameInUse[%name] = true;
break;
}
}
// Create The Client Socket
%connection = new TCPObject(%uniqueName,%socket) { class = ConnectionTCP; parent = %this; Address = %address; Port = %port; };
if (!%this.allowMultiConnect)
%this.connections[%address] = %connection;
else
%this.connections[%address, %port] = %connection;
%this.connectionCount++;
%this.onClientConnect(%address, %connection);
logEcho("Received client connection from " @ %address);
return true;
}
// Callbacks -- make these do whatever you please!
function TCPServer::onClientConnect(%this, %address, %socket)
{
echo("Received connection from " @ %address @ ". ID:" @ %socket);
return true;
}
function TCPServer::onClientRejected(%this, %socket, %reason) // %reason is always zero as of now.
{
return true;
}
function TCPServer::onClientDisconnect(%this, %socket)
{
error("Received Disconnect (" @ %socket @ ")");
return true;
}
function TCPServer::onLine(%this, %socket, %line)
{
echo(%socket SPC "says: " @ %line);
return true;
}
// Lib Functions
function generateString(%length, %alpha)
{
%len = strLen(%alpha);
%result = "";
for (%i = 0; %i < %length; %i++)
%result = %result @ getSubStr(%alpha, getRandom(0, %len), 1);
return %result;
}

View file

@ -0,0 +1,15 @@
//------------------------------------------------------------------------------
// Server Scripts Init
//==============================================================================
exec("scripts/modScripts/server/propData.cs");
exec("scripts/modScripts/server/mining.cs");
exec("scripts/modScripts/server/propertyOwning.cs");
exec("scripts/modScripts/server/looting.cs");
exec("scripts/modScripts/server/serverFunctions.cs");
exec("scripts/modScripts/server/bloodHuman.cs");
exec("scripts/modScripts/server/bloodBioderm.cs");
exec("scripts/modScripts/server/dataImport.cs");
exec("scripts/modScripts/server/serverNetworking.cs");
exec("scripts/modScripts/server/HTTPServer.cs");
exec("scripts/modScripts/server/TorqueExServer.cs");

View file

@ -4,37 +4,37 @@
//----------------------------------------------------------------------------
// DATABLOCKS
//----------------------------------------------------------------------------
datablock StaticShapeData(DetructableSecurityCamera) : StaticShapeDamageProfile
{
className = "SecurityCamera";
shapeFile = "SecurityCamera.dts";
maxDamage = 2.0;
destroyedLevel = 2.0;
disabledLevel = 2.0;
mass = 1.2;
elasticity = 0.1;
friction = 0.9;
collideable = 1;
pickupRadius = 1;
sticky = false;
//datablock StaticShapeData(DetructableSecurityCamera) : StaticShapeDamageProfile
//{
// className = "SecurityCamera";
// shapeFile = "SecurityCamera.dts";
// maxDamage = 2.0;
// destroyedLevel = 2.0;
// disabledLevel = 2.0;
// mass = 1.2;
// elasticity = 0.1;
// friction = 0.9;
// collideable = 1;
// pickupRadius = 1;
// sticky = false;
explosion = CameraGrenadeExplosion;
expDmgRadius = 1.0;
expDamage = 0.1;
expImpulse = 200.0;
dynamicType = $TypeMasks::StaticShapeObjectType;
deployedObject = true;
cmdCategory = "Misc";
cmdIcon = CMDSensorIcon;
// explosion = CameraGrenadeExplosion;
// expDmgRadius = 1.0;
// expDamage = 0.1;
// expImpulse = 200.0;
// dynamicType = $TypeMasks::StaticShapeObjectType;
// deployedObject = true;
// cmdCategory = "Misc";
// cmdIcon = CMDSensorIcon;
targetNameTag = 'Security';
targetTypeTag = 'Camera';
deployAmbientThread = true;
debrisShapeName = "debris_generic_small.dts";
debris = SmallShapeDebris;
heatSignature = 0;
needsPower = true;
};
// targetNameTag = 'Security';
// targetTypeTag = 'Camera';
// deployAmbientThread = true;
// debrisShapeName = "debris_generic_small.dts";
// debris = SmallShapeDebris;
// heatSignature = 0;
// needsPower = true;
//};
datablock StaticShapeData(DeployedSpine) : StaticShapeDamageProfile {
className = "spine";

View file

@ -0,0 +1,222 @@
//------------------------------------------------------------------------------
// torqueExServer.cs
// Torque Extensions for Servers
// Copyright (c) 2012 The DarkDragonDX
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
// Name: setVoice
// Argument %client: The client object to change the voice of.
// Argument %voice: The name of the voice to change to
// Argument %voicepitch: The voicepitch to use
// Description: Changes the voice of the targeted client object.
//==============================================================================
function setVoice(%client, %voice, %voicepitch)
{
freeClientTarget(%client);
%client.voice = %voice;
%client.voicetag = addtaggedstring(%voice);
%client.target = allocClientTarget(%client, %client.name, %client.skin, %client.voiceTag, '_ClientConnection', 0, 0, %client.voicePitch);
if (IsObject(%client.player))
%client.player.setTarget(%client.target);
return true;
}
//------------------------------------------------------------------------------
// Name: setSkin
// Argument %client: The client object to change the voice of.
// Argument %skin: The skin to change to.
// Description: Changes the skin of the targeted client object.
//==============================================================================
function setSkin(%client, %skin)
{
freeClientTarget(%client);
%client.skin = addtaggedstring(%skin);
%client.target = allocClientTarget(%client, %client.name, %client.skin, %client.voiceTag, '_ClientConnection', 0, 0, %client.voicePitch);
// If the client has a player object
if (IsObject(%client.player))
%client.player.setTarget(%client.target);
return true;
}
//------------------------------------------------------------------------------
// Name: setName
// Argument %client: The client object to change the skin of.
// Argument %name: The name to change to.
// Description: Changes the name of the targeted client object.
//==============================================================================
function setName(%client, %name)
{
freeClientTarget(%client);
%client.namebase = %name;
%client.name = addtaggedstring(%name);
%client.target = allocClientTarget(%client, %client.name, %client.skin, %client.voiceTag, '_ClientConnection', 0, 0, %client.voicePitch);
if (IsObject(%client.player))
%client.player.setTarget(%client.target);
//Update the client in the lobby.
HideClient(%client);
ShowClient(%client);
return true;
}
//------------------------------------------------------------------------------
// Name: setTeam
// Argument %client: The client object to change the team of.
// Argument %name: The team to change to.
// Description: Changes the team of the targeted client object.
//==============================================================================
function setTeam(%client,%team)
{
%client.team = %team;
%client.setSensorGroup(%team);
setTargetSensorGroup(%client.target,%team);
return true;
}
//------------------------------------------------------------------------------
// Name: hideClientInLobby
// Argument %client: The client to hide.
// Description: Hides this client object from the lobby only.
// (Doesn't have anything to do with the server list)
//==============================================================================
function hideClientInLobby(%client)
{
messageAllExcept( %client, -1, 'MsgClientDrop', "", Game.kickClientName, %client );
return true;
}
//------------------------------------------------------------------------------
// Name: showClientInLobby
// Argument %client: The client to show.
// Description: Shows this client object in the lobby only.
// (Doesn't have anything to do with the server list)
//==============================================================================
function showClientInLobby(%client)
{
messageAllExcept(%client, -1, 'MsgClientJoin', "", %client.name, %client, %client.target, %client.isAIControlled(), %client.isAdmin, %client.isSuperAdmin, %client.isSmurf, %client.Guid);
return true;
}
//------------------------------------------------------------------------------
// Name: hideClientInList
// Argument %client: The client to hide.
// Description: Hides the client in the server list only.
// WARNING!!! Running this on actual GameConnections is destructive. The game
// will refuse to update the client anymore until they are reshown. This is
// only known to work on AI's without a problem.
//==============================================================================
function hideClientInList(%client)
{
if (!IsObject(HiddenClientGroup))
{
new SimGroup(HiddenClientGroup);
ServerGroup.add(HiddenClientGroup);
}
HiddenClientGroup.add(%client);
return true;
}
//------------------------------------------------------------------------------
// Name: showClientInList
// Argument %client: The client to show.
// Description: Shows the client in the server list only.
//==============================================================================
function showClientInList(%client)
{
ClientGroup.add(%client);
return true;
}
function ServerCMDCheckHTilt(%client){ return %client; } // CCM-based clients spam fix, for some reason they spam this to the server whenever they strafe.
// TypeMasks
$TypeMasks::AllObjectType = -1; //Same thing as everything, thanks to Krash123 for telling me this. :)
$TypeMasks::InteractiveObjectType = $TypeMasks::PlayerObjectType | $TypeMasks::VehicleObjectType | $TypeMasks::WaterObjectType | $TypeMasks::ProjectileObjectType | $TypeMasks::ItemObjectType | $TypeMasks::CorpseObjectType;
$TypeMasks::UnInteractiveObjectType = $TypeMasks::StaticObjectType | $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticTSObjectType | $TypeMasks::StaticRenderedObjectType;
$TypeMasks::BaseAssetObjectType = $TypeMasks::ForceFieldObjectType | $TypeMasks::TurretObjectType | $TypeMasks::SensorObjectType | $TypeMasks::StationObjectType | $TypeMasks::GeneratorObjectType;
$TypeMasks::GameSupportObjectType = $TypeMasks::TriggerObjectType | $TypeMasks::MarkerObjectType | $TypeMasks::CameraObjectType | $TypeMasks::VehicleBlockerObjectType | $TypeMasks::PhysicalZoneObjectType;
$TypeMasks::GameContentObjectType = $TypeMasks::ExplosionObjectType | $TypeMasks::CorpseObjectType | $TypeMasks::DebrisObjectType;
$TypeMasks::DefaultLOSObjectType = $TypeMasks::TerrainObjectType | $TypeMasks::InteriorObjectType | $TypeMasks::StaticObjectType;
// --- Binding Functions
function GameConnection::setVoice(%this, %voice, %voicepitch) { return setVoice(%this, %voice, %voicepitch); }
function GameConnection::setSkin(%this, %skin) { return setSkin(%this, %skin); }
function GameConnection::setName(%this, %name){ return setName(%this, %name); }
function GameConnection::setTeam(%this, %team){ return setTeam(%this, %team); }
function GameConnection::hideInLobby(%this){ return hideClientInLobby(%this); }
function GameConnection::showInLobby(%this){ return showClientInLobby(%this); }
// function GameConnection::hideClientInList(%this){ return hideClientInList(%this); }
// function GameConnection::showClientInList(%this){ return showClientInList(%this); }
function AIConnection::setVoice(%this, %voice, %voicepitch) { return setVoice(%this, %voice, %voicepitch); }
function AIConnection::setSkin(%this, %skin) { return setSkin(%this, %skin); }
function AIConnection::setName(%this, %name){ return setName(%this, %name); }
function AIConnection::setTeam(%this, %team){ return setTeam(%this, %team); }
function AIConnection::hide(%this){ return hideClientInLobby(%this); }
function AIConnection::show(%this){ return showClientInLobby(%this); }
function AIConnection::hideClientInList(%this){ return hideClientInList(%this); }
function AIConnection::showClientInList(%this){ return showClientInList(%this); }
function AIConnection::disengageTasks(%this)
{
// Don't quite remember exactly what the minimal
// requirements here to get the same effect is,
// but this works fine as it is it seems.
AIUnassignClient(%this); // Have no idea what this does!
%this.stop();
%this.clearTasks(); // Clear the Behavior Tree
%this.clearStep();
%this.lastDamageClient = -1;
%this.lastDamageTurret = -1;
%this.shouldEngage = -1;
%this.setEngageTarget(-1);
%this.setTargetObject(-1);
%this.pilotVehicle = false;
%this.defaultTasksAdded = false;
return true;
}
function Player::setVoice(%this, %voice, %voicepitch)
{
if (!isObject(%this.Client))
{
%this.Client = new ScriptObject(); // Glue!
%this.Client.Player = %this;
}
return setVoice(%this.Client, %voice, %voicepitch);
}
function Player::setSkin(%this, %skin)
{
if (!isObject(%this.Client))
{
%this.Client = new ScriptObject();
%this.Client.Player = %this;
}
return setSkin(%this, %skin);
}
function Player::setName(%this, %name)
{
if (!isObject(%this.Client))
{
%this.Client = new ScriptObject();
%this.Client.Player = %this;
}
return setName(%this, %name);
}
function Player::setTeam(%this, %team)
{
if (!isObject(%this.Client))
{
%this.Client = new ScriptObject();
%this.Client.Player = %this;
}
return setTeam(%this, %team);
}

View file

@ -0,0 +1,75 @@
//------------------------------------------------------------------------------
// Array.cs
// Array object you can pass around.
// Copyright (c) 2012 The DarkDragonDX
//==============================================================================
function ArrayFactory::create(%this, %name)
{
if (isObject(%name))
%name = "";
%object = new ScriptObject(%name) { class = "ArrayObject"; };
%object.elementCount = 0;
return %object;
}
function ArrayObject::setElement(%this, %index, %object)
{
%replaced = false;
if (%this.Element[%index] != "")
%replaced = true;
else
{
%this.elementIndex[%index] = %this.elementCount;
%this.elementIndices[%this.elementCount] = %index;
%this.elementCount++;
}
%this.Element[%index] = %object;
return %replaced;
}
function ArrayObject::list(%this)
{
%list = Array.create();
for (%i = 0; %i < %this.elementCount; %i++)
%list.setElement(%i, %this.Element[%this.elementIndices[%i]]);
return %list;
}
function ArrayObject::removeElement(%this, %index)
{
if (%this.Element[%index] != "")
{
%this.Element[%index] = "";
for (%i = %this.elementIndex[%index]; %i < %this.elementCount; %i++)
%this.elementIndices[%i] = %this.elementIndices[%i+1];
%this.elementCount--;
return true;
}
else
return false;
return false;
}
function ArrayObject::isElement(%this, %index)
{
if (%this.Element[%index] == "")
return false;
else
return true;
return false;
}
function ArrayObject::element(%this, %index)
{
return %this.Element[%index];
}
function ArrayObject::count(%this)
{
return %this.elementCount;
}
if (!IsObject(Array))
new ScriptObject(Array) { class = "ArrayFactory"; };

View file

@ -1,201 +1,276 @@
// -----------------------------------------------------
// Block Processing
// -----------------------------------------------------
function getBlockCount(%file,%blockName) //Searches a data file for all occurances of 'blockName'
//------------------------------------------------------------------------------
// basicDataStorage.cs
// Originally written for T2BoL mod back in the day, now is being rewritten
// for the original implementation was pretty crappy.
// Requires: Array.cs
// Copyright (c) 2012 The DarkDragonDX
//==============================================================================
//------------------------------------------------------------------------------
// Name: BasicDataParser.load
// Argument %file: The file to parse and load into memory.
// Description: This function is the main function of everything; it loads
// %file into memory.
// Return: True if the function succeeded, false if otherwise failed.
//==============================================================================
function BasicDataParser::load(%this, %file)
{
if (!IsFile(%file))
return false;
%blockSearch = strLwr("[" @ %blockName @ "]");
%fileP = new FileObject();
%fileP.openForRead(%file);
%count = 0;
while (!%fileP.isEOF())
{
%line = %fileP.readLine();
%lineTest = strLwr(%line);
%Search = strStr(%lineTest,%blockSearch);
if (%search != -1)
%count++;
}
%fileP.detach();
return %count;
}
function getBlockData(%file,%blockName,%num,%data) //Gets values out of a block. Note that 1 is the first block in a file for %num
{
if (!IsFile(%file))
return false;
%blockCount = getBlockCount(%file,%blockName);
if (!%blockCount || %num > %blockCount) //None of 'typeName' exist here
return -1;
%blockSearch = strLwr("[" @ %blockName @ "]");
%fileP = new FileObject();
%fileP.openForRead(%file);
%count = 0;
%lineCount = 0;
while (!%fileP.isEOF())
{
%line = %fileP.readLine();
%lineCount++;
// Make sure we have our values initialised (math doesn't work right on nonexistent variables!)
if (%this.filesLoaded == "")
%this.filesLoaded = 0;
if (%this.blockEntryCount == "")
%this.blockEntryCount = 0;
if (%this.blockInstances == "")
%this.blockInstances = 0;
if (getSubStr(stripSpaces(%line),0,1) !$= ";") //If the beginning of the line is "commented", skip it.
%currentSeconds = formatTimeString("ss");
// Check to see if the data is valid (returns false if we tried to load a nonexistent file)
if (!isFile(%file))
{
error("basicDataStorage.cs: Attempted to load non-existent file " @ %file @ "!");
return false;
}
// Check to see if this file is already loaded
if (%this.isLoaded(%file))
{
error("basicDataStorage.cs: Attempted to reload data file " @ %file SPC "while it's already in memory! (try unloading or emptying)");
return false;
}
// Add the file entry to memory (for the file check above)
%this.files[%this.filesLoaded] = %file;
%this.fileIndex[%file] = %this.filesLoaded;
%this.filesLoaded++;
// Load the file into memory (function is from fileProcessing.cs)
%fileData = strReplace(stripChars(getFileBuffer(%file),"\t"),"\n","\t");
%lineCount = getFieldCount(%fileData);
%isProcessingBlock = false; // Used to set processing mode
%currentBlock = 0;
%hadError = false;
// Iterate through all lines
for (%i = 0; %i < %lineCount; %i++)
{
%currentLine = getField(%fileData,%i);
// Check to see if this line contains a block definition or not
%openingBlock = strStr(%currentLine, "[");
%closingBlock = strStr(%currentLine, "]");
// If we have a block definition, it should be against left margin
if (%openingBlock == 0 && %closingBlock > 0 && !%isProcessingBlock)
{
%lineTest = strLwr(%line);
%Search = strStr(%lineTest,%blockSearch);
if (%Search != -1 && %Count != %num)
%count++;
else if (%count == %num) //We found it, stop incrementing the count and find our data.
%isProcessingBlock = true;
%blockName = getSubStr(%currentLine,%openingBlock+1,%closingBlock-1);
if (%this.blockInstances[%blockName] == "")
{
%Search = strStr(strLwr(%line),strLwr(%data));
%lineTest = strLwr(strReplace(%line," ","")); //See if we exited our block
if (GetSubStr(%lineTest, 0, 1) $= "[") //The beginning of a new block
return -1;
if (%search != -1) //We found it,
%this.blockInstances[%blockName] = 0;
%this.blockEntry[%this.blockEntryCount] = %blockName;
%this.blockEntryCount++;
}
// Create the array to store our block data
%currentBlock = Array.create();
%currentBlock.Name = %blockName;
%currentBlock.File = %file;
%this.blocks[%blockName,%this.blockInstances] = %currentBlock;
%this.blockInstances[%blockName]++;
%this.blockInstances++;
continue;
}
// Results in an error
else if (%openingBlock == 0 && %closingBlock > 0 && %isProcessingBlock)
{
error("basicDataStorage.cs: Error loading file "@ %file @ ", block spacing error.");
return false;
}
// If we're processing the actual block
if (%isProcessingBlock)
{
if (%currentLine $="" || %i == %lineCount)
{
%isProcessingBlock = false;
continue;
}
else
{
%eqPos = strStr(%currentLine,"="); // This is safe since the equals sign should be first.
if (%eqPos == -1)
{
%fileP.detach();
//Since our line might have some sort of commenting after it, we better return to just the "end" symbol..
%semiS =strStr(%line, ";");
if (%semiS == -1)
return -1;
%line = getSubStr(%line, 0, %semiS);
//Now find where "equals" is..
%equalS = strStr(%line, "=");
if (%equalS == -1)
return -1;
%line = getSubStr(%line, %equalS+1, strLen(%line));
//Is our data in single quotations? If so, convert it to a tagged string.
if (strStr(%line,"\x27") != -1) //It is.
%line = addTaggedString(stripChars(%line,"\x27"));
//Now return our string without quotations.
%line = stripChars(stripTrailingSpaces(strReplace(%line,%data,"")),"\x22");
return getSubStr(%line,1,strLen(%line));
error("basicDataStorage.cs: Unable to read entry for block" SPC %currentBlock.Name @ " in file" SPC %file @ "!");
%isProcessingBlock = false;
%hadError = true;
continue;
}
// Note: I got lazy here, just don't have semicolons in your data entries..
%semiPos = strStr(%currentLine,";");
if (%semiPos == -1 || getSubStrOccurance(%currentLine,";") > 1)
{
error("basicDataStorage.cs: Unable to read entry for block" SPC %currentBlock.Name @ " in file" SPC %file @ "!");
%isProcessingBlock = false;
%hadError = true;
continue;
}
%entryName = trim(getSubStr(%currentLine,0,%eqPos-1));
%entryValue = trim(getSubStr(%currentLine,%eqPos+1, mAbs(%eqPos-%semiPos)-1 ));
%currentBlock.setElement(%entryName,%entryValue);
}
}
}
%fileP.detach();
if (!%hadError)
warn("basicDataStorage.cs: Successfully loaded file" SPC %file SPC "in " @ formatTimeString("ss") - %currentSeconds SPC "seconds.");
return !%hadError;
}
//------------------------------------------------------------------------------
// Name: BasicDataParser.unload
// Argument %file: The file of who's entries should be unloaded.
// Description: This function is used to unload data by filename -- useful for
// reloading data from specific files.
// Return: True if the function was successful, false if otherwise failed.
//==============================================================================
function BasicDataParser::unload(%this, %file)
{
if (!%this.isLoaded(%file))
{
error("basicDataStorage.cs: Attempted to unload non-loaded data file " @ %file @ "!");
return false;
}
// Unload any data associated with this file now
%removed = "";
for (%i = 0; %i < %this.blockEntryCount; %i++)
{
%name = %this.blockEntry[%i];
for (%h = 0; %h < %this.blockInstances[%name]; %h++)
if (%this.blocks[%name, %h].File $= %file)
{
%this.blocks[%name, %h].delete();
%this.blocks[%name, %h] = "";
%this.blockEntry[%i] = "";
%removed = trim(%removed SPC %i);
if (%this.blockInstances[%name] == 1)
%this.blockInstances[%name] = "";
else
%this.blockInstances[%name]--;
}
}
// Iterate through our block entries and correct the imbalance
for (%i = 0; %i < getWordCount(%removed); %i++)
{
for (%h = i; %h < %this.blockEntryCount; %h++)
%this.blockEntry[%h-%i] = %this.blockEntry[%h+1];
%this.blockEntryCount--;
}
// Now remove the file entry
for (%i = %this.fileIndex[%file]; %i < %this.filesLoaded; %i++)
if (%i != %this.filesLoaded-1)
{
%this.files[%i] = %this.files[%i+1];
%this.fileIndex[%this.files[%i+1]] = %i;
}
else
{
%this.fileIndex[%file] = "";
%this.files[%i] = "";
}
// Decrement the files loaded count and return true
%this.filesLoaded--;
return true;
}
//------------------------------------------------------------------------------
// Name: BasicDataParser.count
// Argument %block: The bloick entry to count the occurances of
// Return: The occurances of %block in this parser object. If there is no
// such entry of %block anywhere, false (0) is returned.
//==============================================================================
function BasicDataParser::count(%this, %block)
{
// Return zero if the block has no entries even registered
if (%this.blockInstances[%block] == "")
return false;
else
// Return the block Instances otherwise
return %this.blockInstances[%block];
return false; // Shouldn't happen
}
//------------------------------------------------------------------------------
// Name: BasicDataParser.empty
// Description: Empties the entire object of any information it may have
// loaded anytime.
// Return: True is always returned from this function.
//==============================================================================
function BasicDataParser::empty(%this)
{
// Iterate through our block entries and destroy them
for (%i = 0; %i < %this.blockEntryCount; %i++)
{
%name = %this.blockEntry[%i];
for (%h = 0; %h < %this.blockInstances[%name]; %h++)
{
%this.blocks[%name, %h].delete();
%this.blocks[%name, %h] = "";
}
%this.blockInstances[%name] = "";
%this.blockEntry[%i] = "";
}
// Remove the files loaded entries now
for (%i = 0; %i < %this.filesLoaded; %i++)
{
%this.fileIndex[%this.files[%i]] = "";
%this.files[%i] = "";
}
// Reset some variables to 0 and return true
%this.filesLoaded = 0;
%this.blockInstances = 0;
%this.blockEntryCount = 0;
return true;
}
//------------------------------------------------------------------------------
// Name: BasicDataParser.isLoaded
// Argument %file: The file to check the loaded status of.
// Description: Returns if %file is loaded into memory of this object or not.
// Return: A boolean representing the loaded status.
//==============================================================================
function BasicDataParser::isLoaded(%this, %file)
{
// Check to see if this file is already loaded
for (%i = 0; %i < %this.filesLoaded; %i++)
if (%this.files[%i] $= %file)
return true;
return false;
}
//function getBlockLength(%file,%blockName,%num) Won't work until I figure out a way to signal the end of a block without adding any extra characters,
//{
//if (!IsFile(%file))
//return "Not existant.";
//%blockSearch = "[" @ %blockName @ "]";
//%blockSearch = strLwr(%blockSearch); //Convert to lowerCase
//new FileObject(GetBlockCount);
//GetBlockCount.openForRead(%file);
//%count = 0;
//%len = 0;
// while (!GetBlockCount.isEOF())
// {
// %line = GetBlockCount.readLine();
// %lineTest = strLwr(%line);
// %Search = strStr(%lineTest,%blockSearch);
//if (%search != -1)
// %count++;
// else if (%search != -1 && %count == %num) //We found our wanted block, count it.
//{
// if (strStr(%lineTest,%blockSearch) == -1)
// %len++;
// else
// break;
// }
//}
//GetBlockCount.detach();
//return %len;
//}
// -----------------------------------------------------
// Array Processing
// -----------------------------------------------------
function getArrayCount(%file,%array)
//------------------------------------------------------------------------------
// Name: BasicDataParser.get
// Argument %block: The name of the block to return.
// Argument %occurance: The block index we need to return -- if there's
// multiple entries of %block.
// Description: This function is used to retrieve block entries loaded from
// within any of the files this object has parsed.
// Return: An Array (array.cs) containing relevent information to the requested
// block. If there is no such entry of %block, false is returned.
//==============================================================================
function BasicDataParser::get(%this, %block, %occurance)
{
if (!IsFile(%file))
return false;
%arraySearch = strLwr("\x22" @ %array @ "\x22");
%fileP = new FileObject();
%fileP.openForRead(%file);
%count = 0;
while (!%fileP.isEOF())
{
%line = %fileP.readLine();
%lineTest = strLwr(%line);
%Search = strStr(%lineTest,%typeSearch);
if (%search != -1)
%count++;
}
%fileP.detach();
return %count;
}
function getArrayData(%file,%arrayName,%num)
{
if (!IsFile(%file))
return false;
%arrayCount = getArrayCount(%file,%arrayName);
if (!%arrayCount)
return false;
%arraySearch = strLwr("\x22" @ %arrayName @ "\x22");
%fileP = new FileObject();
%fileP.openForRead(%file);
%lineCount = 0;
while (!%fileP.isEOF())
{
%line = stripSpaces(%fileP.readline());
%lineCount++;
if (getSubStr(%line,0,1) !$= ";") //Is this line a comment?
{
%search = strStr(strLwr(%line),%arraySearch);
if (%search !$= -1) //Found it.
break; //Break the loop, we know the array exists
if (%fileP.IsEOF() && %search == -1) //Didn't find it, return the error.
return false;
}
}
//Check where the array actually starts..
%line = %fileP.readLine();
if (%line $= "{") //Data starts on next line..
{
%line = %fileP.readLine(); //Drop it down one
for (%i = 0; %i < %num; %i++) //Keep going untill we hit the wanted data
%line = %fileP.readLine();
}
else //The line we just grabbed is part of the data
{
if (%num == 0) //The wanted data was on line zero..
return %line;
for (%i = 0; %i < %num; %i++) //Keep going untill we hit the wanted data
%line = %fileP.readLine();
}
%fileP.detach();
return %line;
}
// Check ti see uf thus block has only once entry -- in which case %occurance is ignored
if (%this.count(%block) == 1) return %this.blocks[%block, 0];
// Otherwise we use %occurance to return the specific index
else if (%occurance >= 0 && %occurance <= %this.count(%block)) return %this.blocks[%block, %occurance];
return false;
}

View file

@ -6,13 +6,13 @@
function getFileBuffer(%file)
{
if (!IsFile(%file))
return "Not existant.";
return -1;
new FileObject(FileBuffer);
FileBuffer.openForRead(%file);
while (!FileBuffer.isEOF())
%buffer = FileBuffer.readLine() @ "\n";
%buffer = %buffer @ FileBuffer.readLine() @ "\n";
FileBuffer.detach();
return %buffer; //Long string. >.>
}
@ -20,7 +20,7 @@ function getFileBuffer(%file)
function getLine(%file, %line)
{
if (!IsFile(%file))
return "Not existant.";
return -1;
new FileObject(FileLine);
FileLine.openForRead(%file);
@ -34,7 +34,7 @@ function getLine(%file, %line)
function getLine(%file, %line)
{
if (!IsFile(%file))
return "Not existant.";
return -1;
new FileObject(FileLine);
FileLine.openForRead(%file);
@ -45,6 +45,30 @@ function getLine(%file, %line)
return %line;
}
// Returns an unsorted list of the contents of %dir (including folders)
function getDirectory(%dir)
{
%array = Array.create();
%fileCount = 0;
for( %file = findFirstFile( %dir @ "*.*" ); %file !$= ""; %file = findNextFile( %dir @ "*.*" ) )
{
%file = strReplace(%file, %socket.request, "");
if (strStr(%file, "/") != -1)
{
%dir = getSubStr(%file, 0, strStr(%file, "/")) @ "/";
if (!%dirAdded[%dir])
{
%data = %data @ "<a href=\"" @ strReplace(%dir, " ","%20") @ "\">" @ %dir @ "</a><br>\n";
%dirAdded[%dir] = true;
}
}
else
%data = %data @ "<a href=\"" @ strReplace(%file, " ", "%20") @ "\">" @ %file @ "</a><br>\n";
}
return %array;
}
// -----------------------------------------------------
// Bound Functions
// -----------------------------------------------------
@ -54,7 +78,3 @@ function fileObject::Detach(%this) //Detaches fileObject from file & deletes
%this.delete();
return %this;
}

View file

@ -0,0 +1,11 @@
//------------------------------------------------------------------------------
// initialise.cs
// Shared Functions for T2Bol
// Copyright (c) 2012 The DarkDragonDX
//==============================================================================
exec("scripts/modScripts/shared/Array.cs");
exec("scripts/modScripts/shared/stringProcessing.cs");
exec("scripts/modScripts/shared/fileProcessing.cs");
exec("scripts/modScripts/shared/basicDataStorage.cs");

View file

@ -0,0 +1,201 @@
// -----------------------------------------------------
// Block Processing
// -----------------------------------------------------
function getBlockCount(%file,%blockName) //Searches a data file for all occurances of 'blockName'
{
if (!IsFile(%file))
return false;
%blockSearch = strLwr("[" @ %blockName @ "]");
%fileP = new FileObject();
%fileP.openForRead(%file);
%count = 0;
while (!%fileP.isEOF())
{
%line = %fileP.readLine();
%lineTest = strLwr(%line);
%Search = strStr(%lineTest,%blockSearch);
if (%search != -1)
%count++;
}
%fileP.detach();
return %count;
}
function getBlockData(%file,%blockName,%num,%data) //Gets values out of a block. Note that 1 is the first block in a file for %num
{
if (!IsFile(%file))
return false;
%blockCount = getBlockCount(%file,%blockName);
if (!%blockCount || %num > %blockCount) //None of 'typeName' exist here
return -1;
%blockSearch = strLwr("[" @ %blockName @ "]");
%fileP = new FileObject();
%fileP.openForRead(%file);
%count = 0;
%lineCount = 0;
while (!%fileP.isEOF())
{
%line = %fileP.readLine();
%lineCount++;
if (getSubStr(stripSpaces(%line),0,1) !$= ";") //If the beginning of the line is "commented", skip it.
{
%lineTest = strLwr(%line);
%Search = strStr(%lineTest,%blockSearch);
if (%Search != -1 && %Count != %num)
%count++;
else if (%count == %num) //We found it, stop incrementing the count and find our data.
{
%Search = strStr(strLwr(%line),strLwr(%data));
%lineTest = strLwr(strReplace(%line," ","")); //See if we exited our block
if (GetSubStr(%lineTest, 0, 1) $= "[") //The beginning of a new block
return -1;
if (%search != -1) //We found it,
{
%fileP.detach();
//Since our line might have some sort of commenting after it, we better return to just the "end" symbol..
%semiS =strStr(%line, ";");
if (%semiS == -1)
return -1;
%line = getSubStr(%line, 0, %semiS);
//Now find where "equals" is..
%equalS = strStr(%line, "=");
if (%equalS == -1)
return -1;
%line = getSubStr(%line, %equalS+1, strLen(%line));
//Is our data in single quotations? If so, convert it to a tagged string.
if (strStr(%line,"\x27") != -1) //It is.
%line = addTaggedString(stripChars(%line,"\x27"));
//Now return our string without quotations.
%line = stripChars(stripTrailingSpaces(strReplace(%line,%data,"")),"\x22");
return getSubStr(%line,1,strLen(%line));
}
}
}
}
%fileP.detach();
return false;
}
//function getBlockLength(%file,%blockName,%num) Won't work until I figure out a way to signal the end of a block without adding any extra characters,
//{
//if (!IsFile(%file))
//return "Not existant.";
//%blockSearch = "[" @ %blockName @ "]";
//%blockSearch = strLwr(%blockSearch); //Convert to lowerCase
//new FileObject(GetBlockCount);
//GetBlockCount.openForRead(%file);
//%count = 0;
//%len = 0;
// while (!GetBlockCount.isEOF())
// {
// %line = GetBlockCount.readLine();
// %lineTest = strLwr(%line);
// %Search = strStr(%lineTest,%blockSearch);
//if (%search != -1)
// %count++;
// else if (%search != -1 && %count == %num) //We found our wanted block, count it.
//{
// if (strStr(%lineTest,%blockSearch) == -1)
// %len++;
// else
// break;
// }
//}
//GetBlockCount.detach();
//return %len;
//}
// -----------------------------------------------------
// Array Processing
// -----------------------------------------------------
function getArrayCount(%file,%array)
{
if (!IsFile(%file))
return false;
%arraySearch = strLwr("\x22" @ %array @ "\x22");
%fileP = new FileObject();
%fileP.openForRead(%file);
%count = 0;
while (!%fileP.isEOF())
{
%line = %fileP.readLine();
%lineTest = strLwr(%line);
%Search = strStr(%lineTest,%typeSearch);
if (%search != -1)
%count++;
}
%fileP.detach();
return %count;
}
function getArrayData(%file,%arrayName,%num)
{
if (!IsFile(%file))
return false;
%arrayCount = getArrayCount(%file,%arrayName);
if (!%arrayCount)
return false;
%arraySearch = strLwr("\x22" @ %arrayName @ "\x22");
%fileP = new FileObject();
%fileP.openForRead(%file);
%lineCount = 0;
while (!%fileP.isEOF())
{
%line = stripSpaces(%fileP.readline());
%lineCount++;
if (getSubStr(%line,0,1) !$= ";") //Is this line a comment?
{
%search = strStr(strLwr(%line),%arraySearch);
if (%search !$= -1) //Found it.
break; //Break the loop, we know the array exists
if (%fileP.IsEOF() && %search == -1) //Didn't find it, return the error.
return false;
}
}
//Check where the array actually starts..
%line = %fileP.readLine();
if (%line $= "{") //Data starts on next line..
{
%line = %fileP.readLine(); //Drop it down one
for (%i = 0; %i < %num; %i++) //Keep going untill we hit the wanted data
%line = %fileP.readLine();
}
else //The line we just grabbed is part of the data
{
if (%num == 0) //The wanted data was on line zero..
return %line;
for (%i = 0; %i < %num; %i++) //Keep going untill we hit the wanted data
%line = %fileP.readLine();
}
%fileP.detach();
return %line;
}

View file

@ -145,6 +145,7 @@ function getSubStrPos(%string,%str,%num)
%subC = 0;
for (%i = 0; %i < %len; %i++)
{
%curPos = %i;
%sub = getSubStr(%string,%i,1);
if (%sub $= %str)
@ -154,15 +155,42 @@ function getSubStrPos(%string,%str,%num)
break;
}
}
return %i;
return %pos;
}
//------------------------------------------------------------------------------
//------------------------------------------------------------------------------
function strWhite(%string, %whiteList, %char)
{
%charLen = strLen(%char);
for (%i = 0; %i < strLen(%whiteList); %i++)
for (%h = 0; %h < %charLen; %h++)
{
%whiteSeg = getSubStr(%whiteList, %i, %charLen);
}
return false;
}
//------------------------------------------------------------------------------
function getFileNameFromString(%string)
{
return getSubStr(%string,getSubStrPos(%string,"/",getSubStrOccurance(%string, "/"))+1,strLen(%string));
if (strStr(%string, "/") == -1)
return %string;
else
return getSubStr(%string,getSubStrPos(%string,"/",getSubStrOccurance(%string, "/"))+1,strLen(%string));
}
//-------------------------------------------------------------------------------
function getFileExtensionFromString(%string)
{
%file = getFileNameFromString(%string);
%period = strStr(%file,".");
if (%period == -1)
return false;
else
return getSubStr(%string,getSubStrPos(%string,".",getSubStrOccurance(%string, "."))+1,strLen(%string));
}
//------------------------------------------------------------------------------