-Releasing console support (disable by default)

--Allow admin to send some command in server by cli. (do not use those who require a real player)

-Update msg system
--Add RU translation from Lilith (give me that in UTF8 plz guys)
--Upd FR translation from Capuche
--Upd file read for something more dynamic
--upd @langtype to display available when no arg enter as specified in doc
--Fix few typos

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@17255 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
glighta 2013-04-13 13:51:25 +00:00
parent 8a5c0719bb
commit 755000f570
13 changed files with 2005 additions and 467 deletions

View File

@ -1,2 +1,2 @@
t

View File

@ -86,7 +86,7 @@
65: Character's base level raised.
66: Character's base level lowered.
67: Character's job level can't go any higher.
68: character's job level raised.
68: Character's job level raised.
69: Character's job level lowered.
70: You have learned the skill.
71: You have forgotten the skill.
@ -99,7 +99,7 @@
78: %s: %d
79: It is %d affair above.
80: Give the display name or monster name/id please.
81: Your GM level doesn't authorize you to preform this action on the specified player.
81: Your GM level doesn't authorize you to perform this action on the specified player.
82: Please provide a name or number from the list provided:
83: Monster 'Emperium' cannot be spawned.
84: All stats changed!
@ -219,7 +219,7 @@
202: This player has forgotten the skill.
203: This player doesn't have this quest skill.
204: You can't open a shop on this cell.
205: Maybe you meant:
205: Maybe you meant:
206: '%s' skill points reset.
207: '%s' stats points reset.
208: '%s' skill and stat points have been reset.
@ -351,9 +351,9 @@
334: Total Domination
// Templates for @who output
343: Name: %s
344: (%s)
345: | Party: '%s'
343: Name: %s
344: (%s)
345: | Party: '%s'
346: | Guild: '%s'
//You may ommit the last %s, then you won't see players job name
347: | Lv:%d/%d | Job: %s
@ -376,7 +376,7 @@
362: Duel: You can't use @reject without a duel invitation.
363: Duel: The duel invitation has been rejected.
364: Duel: You can't invite %s because he/she isn't on the same map.
365: Duel: Can't use %s in duel.
365: Duel: Can't use %s in duel.
// @duel (part 2)
370: -- Duels: %d/%d, Members: %d/%d, Max players: %d --
371: -- Duels: %d/%d, Members: %d/%d --
@ -429,7 +429,7 @@
419: Server is jammed due to over populated.
420: Your account has not more authorised.
421: Your account has been totally erased.
423: Your account has been banished until
423: Your account has been banished until
424: Login-server has been asked to %s the player '%.*s'.
425: The player '%.*s' doesn't exist.
426: Your GM level don't authorise you to %s the player '%.*s'.
@ -678,7 +678,7 @@
911: Please enter a player name (usage: @jumpto/@warpto/@goto <char name/ID>).
// @who
912: (CID:%d/AID:%d)
912: (CID:%d/AID:%d)
// @whogm
913: Name: %s (GM)
@ -849,58 +849,58 @@
1043: Autotrade Enabled
1044: Autotrade Disabled
1045: Battlegrounds ON
1046: PvP Flags:
1047: Pvp ON |
1048: NoGuild |
1049: NoParty |
1050: NightmareDrop |
1051: NoCalcRank |
1052: GvG Flags:
1053: GvG ON |
1054: GvG Dungeon |
1055: GvG Castle |
1056: NoParty |
1057: Teleport Flags:
1058: NoTeleport |
1059: Monster NoTeleport |
1060: NoWarp |
1061: NoWarpTo |
1062: NoReturn |
1063: NoGo |
1064: NoMemo |
1046: PvP Flags:
1047: Pvp ON |
1048: NoGuild |
1049: NoParty |
1050: NightmareDrop |
1051: NoCalcRank |
1052: GvG Flags:
1053: GvG ON |
1054: GvG Dungeon |
1055: GvG Castle |
1056: NoParty |
1057: Teleport Flags:
1058: NoTeleport |
1059: Monster NoTeleport |
1060: NoWarp |
1061: NoWarpTo |
1062: NoReturn |
1063: NoGo |
1064: NoMemo |
1065: No Exp Penalty: %s | No Zeny Penalty: %s
1066: On
1067: Off
1068: No Save (Return to last Save Point)
1069: No Save, Save Point: %s,Random
1070: No Save, Save Point: %s,%d,%d
1071: Weather Flags:
1072: Snow |
1073: Fog |
1074: Sakura |
1075: Clouds |
1076: Clouds2 |
1077: Fireworks |
1078: Leaves |
//1079: Rain |
1080: Displays Night |
1081: Other Flags:
1082: NoBranch |
1083: NoTrade |
1084: NoVending |
1085: NoDrop |
1086: NoSkill |
1087: NoIcewall |
1088: AllowKS |
1089: Reset |
1090: Other Flags:
1091: NoCommand |
1092: NoBaseEXP |
1093: NoJobEXP |
1094: NoMobLoot |
1095: NoMVPLoot |
1096: PartyLock |
1097: GuildLock |
1071: Weather Flags:
1072: Snow |
1073: Fog |
1074: Sakura |
1075: Clouds |
1076: Clouds2 |
1077: Fireworks |
1078: Leaves |
//1079: Rain |
1080: Displays Night |
1081: Other Flags:
1082: NoBranch |
1083: NoTrade |
1084: NoVending |
1085: NoDrop |
1086: NoSkill |
1087: NoIcewall |
1088: AllowKS |
1089: Reset |
1090: Other Flags:
1091: NoCommand |
1092: NoBaseEXP |
1093: NoJobEXP |
1094: NoMobLoot |
1095: NoMVPLoot |
1096: PartyLock |
1097: GuildLock |
1098: ----- Players in Map -----
1099: Player '%s' (session #%d) | Location: %d,%d
1100: ----- NPCs in Map -----
@ -915,7 +915,7 @@
1109: North
1110: Unknown
1111: NPC %d: %s | Direction: %s | Sprite: %d | Location: %d %d
1112: NPC %d: %s::%s | Direction: %s | Sprite: %d | Location: %d %d
1112: NPC %d: %s::%s | Direction: %s | Sprite: %d | Location: %d %d
1113: ----- Chats in Map -----
1114: Chat: %s | Player: %s | Location: %d %d
1115: Users: %d/%d | Password: %s | Public: %s
@ -1227,7 +1227,7 @@
1277: Item: '%s'/'%s'[%d] (%d) Type: %s | Extra Effect: %s
1278: None
1279: With script
1280: NPC Buy:%dz, Sell:%dz | Weight: %.1f
1280: NPC Buy:%dz, Sell:%dz | Weight: %.1f
1281: - Available in the shops only.
1282: - Maximal monsters drop chance: %02.02f%%
1283: - Monsters don't drop this item.
@ -1289,7 +1289,7 @@
1315: Available Flags:
// @showexp
1316: Gained exp will not be shown.
1316: Gained exp will not be shown.
1317: Gained exp is now shown.
// @showzeny
@ -1322,26 +1322,26 @@
// @itemlist
1332: ------ %s items list of '%s' ------
1333: | equipped:
1334: garment,
1335: left accessory,
1336: body/armor,
1337: right hand,
1338: left hand,
1339: both hands,
1340: feet,
1341: right accessory,
1342: lower head,
1343: top head,
1344: lower/top head,
1345: mid head,
1346: lower/mid head,
1347: lower/mid/top head,
1333: | equipped:
1334: garment,
1335: left accessory,
1336: body/armor,
1337: right hand,
1338: left hand,
1339: both hands,
1340: feet,
1341: right accessory,
1342: lower head,
1343: top head,
1344: lower/top head,
1345: mid head,
1346: lower/mid head,
1347: lower/mid/top head,
1348: -> (pet egg, pet id: %u, named)
1349: -> (pet egg, pet id: %u, unnamed)
1350: -> (crafted item, creator id: %u, star crumbs %d, element %d)
1351: -> (produced item, creator id: %u)
1352: -> (card(s):
1352: -> (card(s):
1353: No item found in this player's %s.
1354: %d item(s) found in %d %s slots.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -14,6 +14,7 @@
#include "../common/utils.h"
#include "../common/cli.h"
#include "../common/random.h"
#include "../common/ers.h"
#include "int_guild.h"
#include "int_homun.h"
#include "int_mercenary.h"
@ -4343,20 +4344,34 @@ int parse_char(int fd)
}
// Console Command Parser [Wizputer]
int parse_console(const char* command)
int parse_console(const char* buf)
{
ShowNotice("Console command: %s\n", command);
char type[64];
char command[64];
int n=0;
if( strcmpi("shutdown", command) == 0 || strcmpi("exit", command) == 0 || strcmpi("quit", command) == 0 || strcmpi("end", command) == 0 )
runflag = 0;
else if( strcmpi("alive", command) == 0 || strcmpi("status", command) == 0 )
if( ( n = sscanf(buf, "%63[^:]:%63[^\n]", type, command) ) < 2 ){
if((n = sscanf(buf, "%63[^\n]", type))<1) return -1; //nothing to do no arg
}
if( n != 2 ){ //end string
command[0] = '\0';
}
ShowNotice("Type of command: '%s' || Command: '%s'\n",type,command);
if( n == 2 && strcmpi("server", type) == 0 ){
if( strcmpi("shutdown", command) == 0 || strcmpi("exit", command) == 0 || strcmpi("quit", command) == 0 ){
runflag = 0;
}
else if( strcmpi("alive", command) == 0 || strcmpi("status", command) == 0 )
ShowInfo(CL_CYAN"Console: "CL_BOLD"I'm Alive."CL_RESET"\n");
else if( strcmpi("help", command) == 0 )
{
ShowInfo("To shutdown the server:\n");
ShowInfo(" 'shutdown|exit|quit|end'\n");
ShowInfo("To know if server is alive:\n");
ShowInfo(" 'alive|status'\n");
}
else if( strcmpi("ers_report", type) == 0 ){
ers_report();
}
else if( strcmpi("help", type) == 0 ){
ShowInfo("Command available :\n");
ShowInfo("\t server:shutdown|alive => stop server\n");
ShowInfo("\t ers_report => display the db usage\n");
}
return 0;
@ -5182,11 +5197,6 @@ int do_init(int argc, char **argv)
add_timer_func_list(online_data_cleanup, "online_data_cleanup");
add_timer_interval(gettick() + 1000, online_data_cleanup, 0, 0, 600 * 1000);
if( console )
{
//##TODO invoke a CONSOLE_START plugin event
}
//Cleaning the tables for NULL entrys @ startup [Sirius]
//Chardb clean
if( SQL_ERROR == Sql_Query(sql_handle, "DELETE FROM `%s` WHERE `account_id` = '0'", char_db) )
@ -5215,6 +5225,10 @@ int do_init(int argc, char **argv)
runflag = CHARSERVER_ST_RUNNING;
}
if( console ){ //start listening
add_timer_func_list(parse_console_timer, "parse_console_timer");
add_timer_interval(gettick()+1000, parse_console_timer, 0, 0, 1000); //start in 1s each 1sec
}
return 0;
}

View File

@ -1,12 +1,18 @@
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#ifdef WIN32
#include <conio.h>
#else
#include <sys/poll.h>
#endif
#include "cbasetypes.h"
#include "showmsg.h"
#include "core.h"
#include "cli.h"
//map confs
char* MAP_CONF_NAME;
char* INTER_CONF_NAME;
char* LOG_CONF_NAME;
@ -14,15 +20,21 @@ char* BATTLE_CONF_FILENAME;
char* ATCOMMAND_CONF_FILENAME;
char* SCRIPT_CONF_NAME;
char* GRF_PATH_FILENAME;
//char
//char confs
char* CHAR_CONF_NAME;
char* SQL_CONF_NAME;
//login
//login confs
char* LOGIN_CONF_NAME;
//common
//common conf (used by multiple serv)
char* LAN_CONF_NAME; //char-login
char* MSG_CONF_NAME_EN; //all
/*
* Function to check if specified option have an argument follow it
* return
* false : no other args found, and throw a warning
* true : something following us
*/
bool opt_has_next_value(const char* option, int i, int argc)
{
if (i >= argc - 1) {
@ -33,19 +45,27 @@ bool opt_has_next_value(const char* option, int i, int argc)
return true;
}
/*======================================================
* Servers Version Screen [MC Cameri]
*------------------------------------------------------*/
/*
* Display some info about emulator such as
* svn version
* website/forum adresse
* irc hangout
*/
void display_versionscreen(bool do_exit)
{
ShowInfo(CL_WHITE"rAthena SVN version: %s" CL_RESET"\n", get_svn_revision());
ShowInfo(CL_GREEN"Website/Forum:"CL_RESET"\thttp://rathena.org/\n");
ShowInfo(CL_GREEN"IRC Channel:"CL_RESET"\tirc://irc.rathena.net/#rathena\n");
ShowInfo(CL_GREEN"IRC Channel:"CL_RESET"\tirc://irc.rizon.net/#rathena\n");
ShowInfo("Open "CL_WHITE"readme.txt"CL_RESET" for more information.\n");
if (do_exit)
exit(EXIT_SUCCESS);
}
/*
* Read the option specify in command line
* and assign the confs used by the different server
* exit on failure or return true
*/
int cli_get_options(int argc, char ** argv)
{
int i = 0;
@ -135,3 +155,29 @@ int cli_get_options(int argc, char ** argv)
}
return 1;
}
int cli_hasevent(){
#ifdef WIN32
return _kbhit();
#else
struct pollfd fds;
fds.fd = 0; /* this is STDIN */
fds.events = POLLIN;
return poll(&fds, 1, 0);
#endif
}
int parse_console_timer(int tid, unsigned int tick, int id, intptr_t data) {
char buf[MAX_CONSOLE_IN]; //max cmd atm is 63+63+63+3+3
memset(buf,0,MAX_CONSOLE_IN); //clear out buf
if(cli_hasevent()){
if(fgets(buf, MAX_CONSOLE_IN, stdin)==NULL)
return -1;
else if(strlen(buf)>MIN_CONSOLE_IN)
parse_console(buf);
}
return 0;
}

View File

@ -12,6 +12,8 @@
extern "C" {
#endif
#define MAX_CONSOLE_IN 200 //max is map...
#define MIN_CONSOLE_IN 4 //min is help
//map
extern char* MAP_CONF_NAME;
extern char* INTER_CONF_NAME;
@ -31,6 +33,8 @@ extern "C" {
extern void display_helpscreen(bool exit);
int cli_get_options(int argc, char ** argv);
int parse_console_timer(int tid, unsigned int tick, int id, intptr_t data);
extern int parse_console(const char* buf); //particular for each serv
#ifdef __cplusplus
}

View File

@ -6,10 +6,10 @@
#include "msg_conf.h"
#include "showmsg.h"
//-----------------------------------------------------------
// Return the message string of the specified number by [Yor]
//-----------------------------------------------------------
/*
* Return the message string of the specified number by [Yor]
* (read in table msg_table, with specified lenght table in size)
*/
const char* _msg_txt(int msg_number,int size, char ** msg_table)
{
if (msg_number >= 0 && msg_number < size &&
@ -19,9 +19,10 @@ const char* _msg_txt(int msg_number,int size, char ** msg_table)
return "??";
}
/*==========================================
* Read Message Data
*------------------------------------------*/
/*
* Read txt file and store them into msg_table
*/
int _msg_config_read(const char* cfgName,int size, char ** msg_table)
{
int msg_number;
@ -62,9 +63,9 @@ int _msg_config_read(const char* cfgName,int size, char ** msg_table)
return 0;
}
/*==========================================
* Cleanup Message Data
*------------------------------------------*/
/*
* Destroy msg_table (freeup mem)
*/
void _do_final_msg(int size, char ** msg_table){
int i;
for (i = 0; i < size; i++)
@ -89,6 +90,10 @@ int msg_langstr2langtype(char * langtype){
return lang;
}
/*
* lookup a langtype into his associate lang string
* return ?? if not found
*/
const char* msg_langtype2langstr(int langtype){
switch(langtype){
case 0: return "English (ENG)";
@ -119,4 +124,4 @@ int msg_checklangtype(int lang, bool display){
ShowDebug("Unsupported langtype '%d'.\n",lang);
}
return -2;
}
}

View File

@ -23,9 +23,13 @@ enum lang_types {
// 0xFF will enable all, while 0x00 will enable English only.
#define LANG_ENABLE 0x00
//read msg in table
const char* _msg_txt(int msg_number,int size, char ** msg_table);
//store msg from txtfile into msg_table
int _msg_config_read(const char* cfgName,int size, char ** msg_table);
//clear msg_table
void _do_final_msg(int size, char ** msg_table);
//Lookups
int msg_langstr2langtype(char * langtype);
const char* msg_langtype2langstr(int langtype);
// Verify that the choosen langtype is enabled.

View File

@ -12,6 +12,7 @@
#include "../common/timer.h"
#include "../common/msg_conf.h"
#include "../common/cli.h"
#include "../common/ers.h"
#include "account.h"
#include "ipban.h"
#include "login.h"
@ -366,49 +367,61 @@ int login_lan_config_read(const char *lancfgName)
//-----------------------
// Console Command Parser [Wizputer]
//-----------------------
int parse_console(const char* command)
{
ShowNotice("Console command: %s\n", command);
int parse_console(const char* buf){
char type[64];
char command[64];
int n=0;
if( strcmpi("shutdown", command) == 0 || strcmpi("exit", command) == 0 || strcmpi("quit", command) == 0 || strcmpi("end", command) == 0 )
runflag = 0;
else if( strcmpi("alive", command) == 0 || strcmpi("status", command) == 0 )
ShowInfo(CL_CYAN"Console: "CL_BOLD"I'm Alive."CL_RESET"\n");
else if( strcmpi("help", command) == 0 )
{
ShowInfo("To shutdown the server:\n");
ShowInfo(" 'shutdown|exit|quit|end'\n");
ShowInfo("To know if server is alive:\n");
ShowInfo(" 'alive|status'\n");
ShowInfo("To create a new account:\n");
ShowInfo(" 'create'\n");
if( ( n = sscanf(buf, "%127[^:]:%255[^\n\r]", type, command) ) < 2 ){
if((n = sscanf(buf, "%63[^\n]", type))<1) return -1; //nothing to do no arg
}
else
{// commands with parameters
char cmd[128], params[256];
if( n != 2 ){ //end string
command[0] = '\0';
}
ShowNotice("Type of command: '%s' || Command: '%s'\n",type,command);
if( sscanf(command, "%127s %255[^\r\n]", cmd, params) < 2 )
{
return 0;
if( n == 2){
if(strcmpi("server", type) == 0 ){
if( strcmpi("shutdown", command) == 0 || strcmpi("exit", command) == 0 || strcmpi("quit", command) == 0 ){
runflag = 0;
}
else if( strcmpi("alive", command) == 0 || strcmpi("status", command) == 0 )
ShowInfo(CL_CYAN"Console: "CL_BOLD"I'm Alive."CL_RESET"\n");
}
if( strcmpi(cmd, "create") == 0 )
if( strcmpi("create",type) == 0 )
{
char username[NAME_LENGTH], password[NAME_LENGTH], sex;
if( sscanf(params, "%23s %23s %c", username, password, &sex) < 3 || strnlen(username, sizeof(username)) < 4 || strnlen(password, sizeof(password)) < 1 )
{
ShowWarning("Console: Invalid parameters for '%s'. Usage: %s <username> <password> <sex:F/M>\n", cmd, cmd);
char username[NAME_LENGTH], password[NAME_LENGTH], md5password[32+1], sex; //23+1 plaintext 32+1 md5
bool md5 = 0;
if( sscanf(command, "%23s %23s %c", username, password, &sex) < 3 || strnlen(username, sizeof(username)) < 4 || strnlen(password, sizeof(password)) < 1 ){
ShowWarning("Console: Invalid parameters for '%s'. Usage: %s <username> <password> <sex:F/M>\n", type, type);
return 0;
}
if( mmo_auth_new(username, password, TOUPPER(sex), "0.0.0.0") != -1 )
{
if( login_config.use_md5_passwds ){
MD5_String(password,md5password);
md5 = 1;
}
if( mmo_auth_new(username,(md5?md5password:password), TOUPPER(sex), "0.0.0.0") != -1 ){
ShowError("Console: Account creation failed.\n");
return 0;
}
ShowStatus("Console: Account '%s' created successfully.\n", username);
}
}
else if( strcmpi("ers_report", type) == 0 ){
ers_report();
}
else if( strcmpi("help", type) == 0 ){
ShowInfo("Command available :\n");
ShowInfo("\t server:shutdown|alive => stop|chk server\n");
ShowInfo("\t ers_report => display the db usage\n");
ShowInfo("\t create:<username> <password> <sex:F|M> => create new account\n");
}
else
{// commands with parameters
}
return 0;
@ -1916,10 +1929,6 @@ int do_init(int argc, char** argv)
}
}
if( login_config.console ) {
//##TODO invoke a CONSOLE_START plugin event
}
// server port open & binding
if( (login_fd = make_listen_bind(login_config.login_ip,login_config.login_port)) == -1 ) {
ShowFatalError("Failed to bind to port '"CL_WHITE"%d"CL_RESET"'\n",login_config.login_port);
@ -1934,6 +1943,11 @@ int do_init(int argc, char** argv)
ShowStatus("The login-server is "CL_GREEN"ready"CL_RESET" (Server is listening on the port %u).\n\n", login_config.login_port);
login_log(0, "login server", 100, "login server started");
if( login_config.console ) {
add_timer_func_list(parse_console_timer, "parse_console_timer");
add_timer_interval(gettick()+1000, parse_console_timer, 0, 0, 1000); //start in 1s each 1sec
}
return 0;
}

View File

@ -9076,38 +9076,38 @@ ACMD_FUNC(fontcolor)
ACMD_FUNC(langtype)
{
char langtype[8];
int lang=-1;
memset(langtype, '\0', sizeof(langtype));
char langstr[8];
int i=0, test=0; char output[100];
if(sscanf(message, "%3s", langtype) < 1){
clif_displaymessage(fd,msg_txt(sd,460)); // Please enter a valid language (usage: @langtype <language>).
}
memset(langstr, '\0', sizeof(langstr));
memset(output, '\0', sizeof(output));
lang = msg_langstr2langtype(langtype); //Switch langstr to associated langtype
if( msg_checklangtype(lang,false) == 1 ){ //Verify it's enabled and set it
char output[100];
pc_setaccountreg(sd, "#langtype", lang); //For login/char
sd->langtype = lang;
sprintf(output,msg_txt(sd,461),msg_langtype2langstr(lang)); // Language is now set to %s.
clif_displaymessage(fd,output);
return 0;
} else if (lang != -1) {
clif_displaymessage(fd,msg_txt(sd,462)); // This langage is currently disabled.
return -1;
} else {
int i=0, test=0; char output[100];
clif_displaymessage(fd,msg_txt(sd,464)); // Available languages:
while(test!=-1){ //out of range
test = msg_checklangtype(i,false);
if(test == 1) {
sprintf(output,"%s\n",msg_langtype2langstr(i));
clif_displaymessage(fd,output);
}
i++;
if(sscanf(message, "%3s", langstr) >= 1){
int lang=-1;
lang = msg_langstr2langtype(langstr); //Switch langstr to associated langtype
if( msg_checklangtype(lang,false) == 1 ){ //Verify it's enabled and set it
char output[100];
pc_setaccountreg(sd, "#langtype", lang); //For login/char
sd->langtype = lang;
sprintf(output,msg_txt(sd,461),msg_langtype2langstr(lang)); // Language is now set to %s.
clif_displaymessage(fd,output);
return 0;
} else if (lang != -1) { //defined langage but failed check
clif_displaymessage(fd,msg_txt(sd,462)); // This langage is currently disabled.
return -1;
}
return -1;
}
//wrong or no entry
clif_displaymessage(fd,msg_txt(sd,460)); // Please enter a valid language (usage: @langtype <language>).
clif_displaymessage(fd,msg_txt(sd,464)); // Available languages:
while(test!=-1){ //out of range
test = msg_checklangtype(i,false);
if(test == 1)
clif_displaymessage(fd,msg_langtype2langstr(i));
i++;
}
return -1;
}
ACMD_FUNC(reloadmsgconf)

View File

@ -310,7 +310,9 @@ int merc_hom_levelup(struct homun_data *hd)
return 0;
}
if(((m_class&HOM_REG) && hd->homunculus.level >= battle_config.hom_max_level) || ((m_class&HOM_S) && hd->homunculus.level >= battle_config.hom_S_max_level) || !hd->exp_next || hd->homunculus.exp < hd->exp_next)
if(((m_class&HOM_REG) && hd->homunculus.level >= battle_config.hom_max_level)
|| ((m_class&HOM_S) && hd->homunculus.level >= battle_config.hom_S_max_level)
|| !hd->exp_next || hd->homunculus.exp < hd->exp_next)
return 0;
hom = &hd->homunculus;

View File

@ -3100,8 +3100,7 @@ static int char_ip_set = 0;
/*==========================================
* Console Command Parser [Wizputer]
*------------------------------------------*/
int parse_console(const char* buf)
{
int parse_console(const char* buf){
char type[64];
char command[64];
char map[64];
@ -3114,65 +3113,51 @@ int parse_console(const char* buf)
memset(&sd, 0, sizeof(struct map_session_data));
strcpy(sd.status.name, "console");
if( ( n = sscanf(buf, "%63[^:]:%63[^:]:%63s %hd %hd[^\n]", type, command, map, &x, &y) ) < 5 )
{
if( ( n = sscanf(buf, "%63[^:]:%63[^\n]", type, command) ) < 2 )
{
n = sscanf(buf, "%63[^\n]", type);
if( ( n = sscanf(buf, "%63[^:]:%63[^:]:%63s %hd %hd[^\n]", type, command, map, &x, &y) ) < 5 ){
if( ( n = sscanf(buf, "%63[^:]:%63[^\n]", type, command) ) < 2 ) {
if((n = sscanf(buf, "%63[^\n]", type))<1) return -1; //nothing to do no arg
}
}
if( n == 5 )
{
m = map_mapname2mapid(map);
if( m < 0 )
{
ShowWarning("Console: Unknown map.\n");
return 0;
}
sd.bl.m = m;
map_search_freecell(&sd.bl, m, &sd.bl.x, &sd.bl.y, -1, -1, 0);
if( x > 0 )
sd.bl.x = x;
if( y > 0 )
sd.bl.y = y;
}
else
{
if( n != 5 ){ //end string
map[0] = '\0';
if( n < 2 )
command[0] = '\0';
if( n < 1 )
type[0] = '\0';
}
ShowNotice("Type of command: '%s' || Command: '%s' || Map: '%s' Coords: %d %d\n", type, command, map, x, y);
if( n == 5 && strcmpi("admin",type) == 0 )
{
if( !is_atcommand(sd.fd, &sd, command, 0) )
if(strcmpi("admin",type) == 0 ) {
if(strcmpi("map",command) == 0){
m = map_mapname2mapid(map);
if( m < 0 ){
ShowWarning("Console: Unknown map.\n");
return 0;
}
sd.bl.m = m;
map_search_freecell(&sd.bl, m, &sd.bl.x, &sd.bl.y, -1, -1, 0);
if( x > 0 )
sd.bl.x = x;
if( y > 0 )
sd.bl.y = y;
}
else if( !is_atcommand(sd.fd, &sd, command, 0) )
ShowInfo("Console: not atcommand\n");
}
else if( n == 2 && strcmpi("server", type) == 0 )
{
if( strcmpi("shutdown", command) == 0 || strcmpi("exit", command) == 0 || strcmpi("quit", command) == 0 )
{
else if( n == 2 && strcmpi("server", type) == 0 ){
if( strcmpi("shutdown", command) == 0 || strcmpi("exit", command) == 0 || strcmpi("quit", command) == 0 ){
runflag = 0;
}
}
else if( strcmpi("ers_report", type) == 0 ){
ers_report();
}
else if( strcmpi("help", type) == 0 )
{
ShowInfo("To use GM commands:\n");
ShowInfo(" admin:<gm command>:<map of \"gm\"> <x> <y>\n");
ShowInfo("You can use any GM command that doesn't require the GM.\n");
ShowInfo("No using @item or @warp however you can use @charwarp\n");
ShowInfo("The <map of \"gm\"> <x> <y> is for commands that need coords of the GM\n");
ShowInfo("IE: @spawn\n");
ShowInfo("To shutdown the server:\n");
ShowInfo(" server:shutdown\n");
else if( strcmpi("help", type) == 0 ) {
ShowInfo("Command available :\n");
ShowInfo("\t admin:@acmd => use an atcommand\n");
ShowInfo("\t admin:map:<map><x><y> => change our current map\n");
ShowInfo("\t server:shutdown => stop server\n");
ShowInfo("\t ers_report => display the db usage\n");
}
return 0;
@ -3708,23 +3693,25 @@ struct msg_data *map_lang2msgdb(uint8 lang){
}
void map_do_init_msg(void){
map_msg_db = idb_alloc(DB_OPT_BASE);
int test=0, i=0, size;
char * listelang[] = {
MSG_CONF_NAME_EN, //default
MSG_CONF_NAME_RUS,
MSG_CONF_NAME_SPN,
MSG_CONF_NAME_GRM,
MSG_CONF_NAME_CHN,
MSG_CONF_NAME_MAL,
MSG_CONF_NAME_IDN,
MSG_CONF_NAME_FRN
};
msg_config_read(MSG_CONF_NAME_EN,0); // English (default)
if( LANG_ENABLE&LANG_RUS )
msg_config_read(MSG_CONF_NAME_RUS,1); // Russian
if( LANG_ENABLE&LANG_SPN )
msg_config_read(MSG_CONF_NAME_SPN,2); // Spanish
if( LANG_ENABLE&LANG_GRM )
msg_config_read(MSG_CONF_NAME_GRM,3); // German
if( LANG_ENABLE&LANG_CHN )
msg_config_read(MSG_CONF_NAME_CHN,4); // Chinese
if( LANG_ENABLE&LANG_MAL )
msg_config_read(MSG_CONF_NAME_MAL,5); // Malaysian
if( LANG_ENABLE&LANG_IDN )
msg_config_read(MSG_CONF_NAME_IDN,6); // Indonesian
if( LANG_ENABLE&LANG_FRN )
msg_config_read(MSG_CONF_NAME_FRN,7); // French
map_msg_db = idb_alloc(DB_OPT_BASE);
size = ARRAYLENGTH(listelang); //avoid recalc
while(test!=-1 && size>i){ //for all enable lang +(English default)
test = msg_checklangtype(i,false);
if(test == 1) msg_config_read(listelang[i],i); //if enable read it and assign i to langtype
i++;
}
}
void map_do_final_msg(void){
DBIterator *iter = db_iterator(map_msg_db);
@ -3809,7 +3796,7 @@ int do_init(int argc, char *argv[])
GRF_PATH_FILENAME = "conf/grf-files.txt";
/* Multilanguage */
MSG_CONF_NAME_EN = "conf/msg_conf/map_msg.conf"; // English (default)
MSG_CONF_NAME_EN = "conf/msg_conf/map_msg.conf"; // English (default)
MSG_CONF_NAME_RUS = "conf/msg_conf/map_msg_rus.conf"; // Russian
MSG_CONF_NAME_SPN = "conf/msg_conf/map_msg_spn.conf"; // Spanish
MSG_CONF_NAME_GRM = "conf/msg_conf/map_msg_grm.conf"; // German
@ -3906,11 +3893,6 @@ int do_init(int argc, char *argv[])
npc_event_do_oninit(); // Init npcs (OnInit)
if( console )
{
//##TODO invoke a CONSOLE_START plugin event
}
if (battle_config.pk_mode)
ShowNotice("Server is running on '"CL_WHITE"PK Mode"CL_RESET"'.\n");
@ -3926,6 +3908,11 @@ int do_init(int argc, char *argv[])
exit(EXIT_FAILURE);
#endif
if( console ){ //start listening
add_timer_func_list(parse_console_timer, "parse_console_timer");
add_timer_interval(gettick()+1000, parse_console_timer, 0, 0, 1000); //start in 1s each 1sec
}
return 0;
}