diff options
-rw-r--r-- | conf/map/battle/party.conf | 6 | ||||
-rw-r--r-- | doc/script_commands.txt | 39 | ||||
-rw-r--r-- | src/map/battle.c | 1 | ||||
-rw-r--r-- | src/map/battle.h | 3 | ||||
-rw-r--r-- | src/map/clif.h | 1 | ||||
-rw-r--r-- | src/map/party.c | 5 | ||||
-rw-r--r-- | src/map/script.c | 118 |
7 files changed, 158 insertions, 15 deletions
diff --git a/conf/map/battle/party.conf b/conf/map/battle/party.conf index 07a0bdaea..a38321806 100644 --- a/conf/map/battle/party.conf +++ b/conf/map/battle/party.conf @@ -41,6 +41,12 @@ party_update_interval: 1000 // 1: Athena - bar is updated with the party map dots (up to 1 second delay) party_hp_mode: 0 +// When changing party leader, should the new leader be in the same map +// as the current leader. (Note 1) +// true: Aegis - They must be in the same map +// false: Athena - They can be in different maps +party_change_leader_same_map: true + // When 'Party Share' item sharing is enabled in a party, // announce in the party which party-member received the item and what's he received? (Note 1) show_party_share_picker: true diff --git a/doc/script_commands.txt b/doc/script_commands.txt index 331bed1c7..5c730106b 100644 --- a/doc/script_commands.txt +++ b/doc/script_commands.txt @@ -3305,6 +3305,27 @@ Notice that NPC objects disabled with disablenpc() will still be located. --------------------------------------- +*getmapinfo(<info>{, "<map name>"}) +*getmapinfo(<info>{, <map id>}) + +This command returns various information about a specific map. If the second +argument is omitted, it will try to use the map of the attached NPC, or the +map of the attached player if the NPC can't be found. + +Valid <info> are: + MAPINFO_NAME name of the map + MAPINFO_ID numeric ID of the map + MAPINFO_ZONE name of the zone used by the map + MAPINFO_SIZE_X width of the map (cells on the x axis) + MAPINFO_SIZE_Y height of the map (cells on the y axis) + +Examples: + getmapinfo(MAPINFO_ID, "map name"); // ID from name + getmapinfo(MAPINFO_NAME, 3); // name from ID + getmapinfo(MAPINFO_ZONE); // zone, ie Normal, PvP, Jail, ... + +--------------------------------------- + *getunits(<type>, <variable>, <limit>, "<map>"{, <x1>, <y1>, <x2>, <y2>}) This function searches a whole map or area for units and adds their GID to @@ -7506,13 +7527,21 @@ window). It will not be displayed anywhere else. debugmes("\033[38D\033[K ==Message== \n"); // enable colour code. --------------------------------------- -*logmes("<message>") +*logmes("<message>"{, <log type>}) + +This command will write the message given to the map server log files, as +specified in 'conf/map/logs.conf'. If SQL logging is enabled, the message will +go to the specified log table. If logs are not enabled, nothing will happen. + +Log types are: -This command will write the message given to the map server NPC log file, -as specified in 'conf/map/logs.conf'. If SQL logging is enabled, the message -will go to the 'npclog' table. +LOGMES_NPC - log to the 'npclog' table (Default) +LOGMES_ATCOMMAND - log to the 'atcommandlog' table + +Example: -If logs are not enabled for NPCs, nothing will happen. + logmes("foobar"); + logmes("foobar", LOGMES_ATCOMMAND); --------------------------------------- diff --git a/src/map/battle.c b/src/map/battle.c index 2861599b8..9c6e67694 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -7096,6 +7096,7 @@ static const struct battle_data { { "vending_over_max", &battle_config.vending_over_max, 1, 0, 1, }, { "show_steal_in_same_party", &battle_config.show_steal_in_same_party, 0, 0, 1, }, { "party_hp_mode", &battle_config.party_hp_mode, 0, 0, 1, }, + { "party_change_leader_same_map", &battle_config.party_change_leader_same_map, 0, 0, 1, }, { "show_party_share_picker", &battle_config.party_show_share_picker, 1, 0, 1, }, { "show_picker_item_type", &battle_config.show_picker_item_type, 112, 0, INT_MAX, }, { "party_update_interval", &battle_config.party_update_interval, 1000, 100, INT_MAX, }, diff --git a/src/map/battle.h b/src/map/battle.h index e6129ca7c..4a63887c4 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -298,6 +298,7 @@ struct Battle_Config { int show_steal_in_same_party; int party_share_type; int party_hp_mode; + int party_change_leader_same_map; int party_show_share_picker; int show_picker_item_type; int attack_attr_none; @@ -545,7 +546,7 @@ struct Battle_Config { int player_warp_keep_direction; int atcommand_levelup_events; // Enable atcommands trigger level up events for NPCs - + int bow_unequip_arrow; int max_summoner_parameter; // Summoner Max Stats diff --git a/src/map/clif.h b/src/map/clif.h index ac8cc8d35..73cb72128 100644 --- a/src/map/clif.h +++ b/src/map/clif.h @@ -385,6 +385,7 @@ enum clif_messages { MSG_SECONDS_UNTIL_USE = 0x746, ///< %d seconds left until you can use MSG_NPC_WORK_IN_PROGRESS = 0x783, // FIXME[Haru]: This seems to be 0x784 in the msgstringtable files I found. MSG_REINS_CANT_USE_MOUNTED = 0x78b, // FIXME[Haru]: This seems to be 0x785 in the msgstringtalbe files I found. + MSG_PARTY_LEADER_SAMEMAP = 0x82e, //< It is only possible to change the party leader while on the same map. }; /** diff --git a/src/map/party.c b/src/map/party.c index 26b4bae8b..a4a7e6dca 100644 --- a/src/map/party.c +++ b/src/map/party.c @@ -731,6 +731,11 @@ bool party_changeleader(struct map_session_data *sd, struct map_session_data *ts return false; } + if (battle_config.party_change_leader_same_map && sd->bl.m != tsd->bl.m) { + clif->msgtable(sd, MSG_PARTY_LEADER_SAMEMAP); // It is only possible to change the party leader while on the same map. + return false; + } + if( map->list[sd->bl.m].flag.partylock ) { clif->message(sd->fd, msg_sd(sd,287)); // You cannot change party leaders in this map. return false; diff --git a/src/map/script.c b/src/map/script.c index 367c9927d..e2f53088c 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -12779,6 +12779,76 @@ BUILDIN(setmapflagnosave) { return true; } +enum mapinfo_info { + MAPINFO_NAME, + MAPINFO_ID, + MAPINFO_SIZE_X, + MAPINFO_SIZE_Y, + MAPINFO_ZONE +}; + +BUILDIN(getmapinfo) +{ + enum mapinfo_info mode = script_getnum(st, 2); + int16 m; + + if (script_hasdata(st, 3)) { + if (script_isstringtype(st, 3)) { + const char *str = script_getstr(st, 3); + m = map->mapname2mapid(str); + } else { + m = script_getnum(st, 3); + } + } else { + struct block_list *bl = NULL; + + if (st->oid) { + bl = map->id2bl(st->oid); + } else if (st->rid) { + bl = map->id2bl(st->rid); + } + + if (bl == NULL) { + ShowError("script:getmapinfo: map not supplied and NPC/PC not attached!\n"); + script_pushint(st, -3); + return false; + } + + m = bl->m; + } + + if (m < 0) { + // here we don't throw an error, so the command can be used + // to detect whether or not a map exists + script_pushint(st, -1); + return true; + } + + switch (mode) { + case MAPINFO_NAME: + script_pushconststr(st, map->list[m].name); + break; + case MAPINFO_ID: + script_pushint(st, m); + break; + case MAPINFO_SIZE_X: + script_pushint(st, map->list[m].xs); + break; + case MAPINFO_SIZE_Y: + script_pushint(st, map->list[m].ys); + break; + case MAPINFO_ZONE: + script_pushstrcopy(st, map->list[m].zone->name); + break; + default: + ShowError("script:getmapinfo: unknown option in second argument (%u).\n", mode); + script_pushint(st, -2); + return false; + } + + return true; +} + BUILDIN(getmapflag) { int16 m,i; @@ -15785,19 +15855,37 @@ BUILDIN(getmapxy) return true; } +enum logmes_type { + LOGMES_NPC, + LOGMES_ATCOMMAND +}; + /*========================================== - * Allows player to write NPC logs (i.e. Bank NPC, etc) [Lupus] + * Allows player to write logs (i.e. Bank NPC, etc) [Lupus] *------------------------------------------*/ -BUILDIN(logmes) -{ - const char *str; +BUILDIN(logmes) { + const char *str = script_getstr(st, 2); struct map_session_data *sd = script->rid2sd(st); + enum logmes_type type = LOGMES_NPC; + nullpo_retr(sd, false); - if (sd == NULL) - return true; + if (script_hasdata(st, 3)) { + type = script_getnum(st, 3); + } + + switch (type) { + case LOGMES_ATCOMMAND: + logs->atcommand(sd, str); + break; + case LOGMES_NPC: + logs->npc(sd, str); + break; + default: + ShowError("script:logmes: Unknown log type!\n"); + st->state = END; + return false; + } - str = script_getstr(st,2); - logs->npc(sd,str); return true; } @@ -23994,6 +24082,7 @@ void script_parse_builtin(void) { BUILDIN_DEF(isloggedin,"i?"), BUILDIN_DEF(setmapflagnosave,"ssii"), BUILDIN_DEF(getmapflag,"si"), + BUILDIN_DEF(getmapinfo,"i?"), BUILDIN_DEF(setmapflag,"si?"), BUILDIN_DEF(removemapflag,"si"), BUILDIN_DEF(pvpon,"s"), @@ -24070,7 +24159,7 @@ void script_parse_builtin(void) { BUILDIN_DEF(checkoption2,"i?"), BUILDIN_DEF(guildgetexp,"i"), BUILDIN_DEF(guildchangegm,"is"), - BUILDIN_DEF(logmes,"s"), //this command actls as MES but rints info into LOG file either SQL/TXT [Lupus] + BUILDIN_DEF(logmes,"s?"), //this command actls as MES but rints info into LOG file either SQL/TXT [Lupus] BUILDIN_DEF(summon,"si??"), // summons a slave monster [Celest] BUILDIN_DEF(isnight,""), // check whether it is night time [Celest] BUILDIN_DEF(isequipped,"i*"), // check whether another item/card has been equipped [Celest] @@ -24597,6 +24686,10 @@ void script_hardcoded_constants(void) script->set_constant("DATATYPE_VAR", DATATYPE_VAR, false, false); script->set_constant("DATATYPE_LABEL", DATATYPE_LABEL, false, false); + script->constdb_comment("Logmes types"); + script->set_constant("LOGMES_NPC", LOGMES_NPC, false, false); + script->set_constant("LOGMES_ATCOMMAND", LOGMES_ATCOMMAND, false, false); + script->constdb_comment("Item Subtypes (Weapon types)"); script->set_constant("W_FIST", W_FIST, false, false); script->set_constant("W_DAGGER", W_DAGGER, false, false); @@ -24648,6 +24741,13 @@ void script_hardcoded_constants(void) script->set_constant("DRESSROOM_OPEN", DRESSROOM_OPEN, false, false); script->set_constant("DRESSROOM_CLOSE", DRESSROOM_CLOSE, false, false); + script->constdb_comment("getmapinfo options"); + script->set_constant("MAPINFO_NAME", MAPINFO_NAME, false, false); + script->set_constant("MAPINFO_ID", MAPINFO_ID, false, false); + script->set_constant("MAPINFO_SIZE_X", MAPINFO_SIZE_X, false, false); + script->set_constant("MAPINFO_SIZE_Y", MAPINFO_SIZE_Y, false, false); + script->set_constant("MAPINFO_ZONE", MAPINFO_ZONE, false, false); + script->constdb_comment("Renewal"); #ifdef RENEWAL script->set_constant("RENEWAL", 1, false, false); |