Dynamic MOTD? -
rangerxxll - 26.11.2014
Coming back from a lengthy break from coding, and I forgot a good portion of Y_Ini.
How would one create a dynamic MOTD for his server? I'll add the code I have managed to put together below.
Also, how would you use ini parsefile in this type of scenario when loading from a file?
pawn Код:
#define ServerPath "Server/%s.ini"
enum ServerInfo
{
sServerMessage[100]
};
new sInfo[ServerInfo];
//This is a very basic command I have created to create the actual file.
CMD:motdtest(playerid, params[])
{
new path[128];
format(path,sizeof(path), ServerPath);
if(fexist(path))
{
INI_ParseFile(path(server),"LoadServer_data", .bExtra = true, .extra = ?);
}
else
{
new INI:file = INI_Open(path);
INI_SetTag(file, "Server");
INI_WriteString(file, "ServerMessage", "Change me via /servermessage.");
INI_Close(file);
}
return 1;
}
public LoadServer_data(name[], value[])
{
INI_String("ServerMessage", sInfo[sServerMessage], 100);
return 1;
}
Thank you for any help.
Re: Dynamic MOTD? -
Write - 26.11.2014
pawn Код:
CMD:servermessage(playerid, params[])
{
new string[100];
if(sscanf(params, "s[100]", params))
{
SendClientMessage(playerid, COLOR_WHITE, "USAGE: /servermessage [message]");
return 1;
}
format(sInfo[sServerMessage], sizeof(sInfo[sServerMessage]), "%s", params);
return 1;
}
pawn Код:
public OnPlayerSpawn(playerid)
{
new string[100];
if(strlen(sInfo[sServerMessage]) > 0)
{
format(string, sizeof(string), "Server Message: %s", sInfo[sServerMessage]);
SendClientMessage(playerid, -1, string);
}
return 1;
}
Re: Dynamic MOTD? -
rangerxxll - 26.11.2014
How would that save it to a file and make it load?
Re: Dynamic MOTD? -
Abagail - 26.11.2014
You can probably use normal file functions. In that case,
pawn Код:
stock SaveMOTD()
{
if(fexists("motd.ini"))
{
new File:motd = fopen("motd.ini", io_write);
fwrite(motd, serverMOTD);
fclose(motd);
return 1;
}
return true;
}
stock LoadMOTD()
{
if(fexists("motd.ini"))
{
new File:motd = fopen("motd.ini", io_read);
fread(file, serverMOTD);
fclose(file);
return 1;
}
return true;
}
And then simply,
pawn Код:
public OnPlayerConnect(playerid)
{
new string[64];
format(string, sizeof(string), "MOTD: %s", serverMOTD);
SendClientMessage(playerid, -1, string);
return 1;
}
Re: Dynamic MOTD? -
Write - 26.11.2014
pawn Код:
stock INI_Get(filename[],key[])
{
new File:F,string[128];
new sname[24],sval[24];
F = fopen(filename,io_read);
if(!F) return sname; while(fread(F,string))
{
sscanf(string,"p<=>s[24]s[24]",sname,sval);
if(!strcmp(sname,key))
{
sval[strlen(sval)-2] = 0;
fclose(F);
return sval;
}
}
fclose(F);
sname[0] = '\0';
return sname;
}
stock LoadMessage()
{
new path[128];
format(path,sizeof(path), ServerPath);
new INI:file = INI_Open(path);
INI_SetTag(file, "Server");
INI_WriteString(file, "ServerMessage", sInfo[sServerMessage]);
INI_Close(file);
return 1;
}
stock SaveMessage()
{
new path[128];
format(path,sizeof(path), ServerPath);
new INI:file = INI_Open(path);
INI_SetTag(file, "Server");
INI_Get(file, "ServerMessage");
INI_Close(file);
return 1;
}
I hate y_ini

.
Re: Dynamic MOTD? -
rangerxxll - 29.11.2014
Still having issues. Can anyone help me out? I'd like to know how to do it with yini.
Re: Dynamic MOTD? -
M4D - 30.11.2014
Hi.
i will explain the code with comment in the script.
pawn Код:
#include <YSI\y_ini>
//>Including y_ini from YSI Library
#include <zcmd>
//> i'll use ZCMD to make command
#include <sscanf2>
//>For command
#define ServerFile "Server/Info.ini" //>Definind .ini file address in > scriptfiles/Server/"Ini file"
//>You have to create "Server" Folder in scriptfile folder in your server files.
enum sInfo //>Creating enum for variables that i want to load my ini file data into it!
{
LoginMSG[128] //> String
}
new ServerInfo[sInfo]; //>My Variable(s)
//>Creating a callback that i will use to load my ini file into variables With "INI_ParseFile" function.
forward LoadServerInfo(name[], value[]);
public LoadServerInfo(name[], value[])
{
INI_String("LoginMSG",ServerInfo[LoginMSG],128); //> i use "INI_String" to load a string into "ServerInfo[LoginMSG]" Variable
return 1;
}
public OnGameModeInit() //>Load Data from file when server start
{
INI_ParseFile(ServerFile, "LoadServerInfo", .bExtra = false, .extra = 0); //>Load "ServerFile" path with "LoadServerInfo" Function that i created.
return 1;
}
public OnPlayerConnect(playerid) //>Sending ServerMSG with formating "ServerInfo[LoginMSG]" Variable...
{
//>My Server Message Loaded in "ServerInfo[LoginMSG]" Variable with "LoadServerInfo" Callback
new string[128];
format(string,sizeof(string),"%s",ServerInfo[LoginMSG]);
SendClientMessage(playerid,-1,string);
return 1;
}
//>Creatind command for creating or updating "Info.ini" File !!
CMD:servermsg(playerid, params[])
{
new servermsg[128];
if(sscanf(params,"s[128]",servermsg)) return SendClientMessage(playerid,-1,"Usage: /servermsg [Your Login Message]");
new INI:File = INI_Open("Server/Info.ini"); //>Open Or Create Info.ini File in /scriptfiles/Server/Info.ini
INI_SetTag(File,"sdata"); //>Set "[sdata]" tag in ini file for assortment data
INI_WriteString(File,"LoginMSG",servermsg); //>wreite "servermsg" that i used in sscanf (my msg)
INI_Close(File); //>Closing File that i opened for writing
SendClientMessage(playerid,-1,"Your Srver Message Successfully Created."); //> :D :D
return 1;
}
hope i helped...
Good Luck.