diff options
-rw-r--r-- | Changelog-SVN.txt | 21 | ||||
-rw-r--r-- | conf-tmpl/battle_athena.conf | 9 | ||||
-rw-r--r-- | conf-tmpl/msg_athena.conf | 8 | ||||
-rw-r--r-- | db/Changelog.txt | 1 | ||||
-rw-r--r-- | db/item_db.txt | 30 | ||||
-rw-r--r-- | npc/Changelog.txt | 2 | ||||
-rw-r--r-- | npc/quests/juice_maker.txt | 2 | ||||
-rw-r--r-- | src/common/core.c | 13 | ||||
-rw-r--r-- | src/map/atcommand.c | 111 | ||||
-rw-r--r-- | src/map/battle.c | 13 | ||||
-rw-r--r-- | src/map/battle.h | 4 | ||||
-rw-r--r-- | src/map/itemdb.c | 8 | ||||
-rw-r--r-- | src/map/map.c | 2 | ||||
-rw-r--r-- | src/map/map.h | 2 | ||||
-rw-r--r-- | src/map/mob.c | 17 | ||||
-rw-r--r-- | src/map/npc.c | 19 | ||||
-rw-r--r-- | src/map/pc.c | 26 | ||||
-rw-r--r-- | src/map/script.c | 6 | ||||
-rw-r--r-- | src/map/skill.c | 76 | ||||
-rw-r--r-- | src/map/status.c | 3 | ||||
-rw-r--r-- | src/map/storage.c | 15 | ||||
-rw-r--r-- | src/map/trade.c | 8 |
22 files changed, 185 insertions, 211 deletions
diff --git a/Changelog-SVN.txt b/Changelog-SVN.txt index f9eb4276c..74b25e370 100644 --- a/Changelog-SVN.txt +++ b/Changelog-SVN.txt @@ -2,6 +2,25 @@ Date Added 03/22 * Fixed Alchemist's CANNIBALIZE, now it summons correct # of plants. With their real HP [Lupus] + * Updated @reloadmobdb, @reloadskilldb, @reloaditemdb [celest] + * Some tidying up in @reloadscript (more work needed) [celest] + * Moved some gm command messages to msg_athena.conf [celest] + * Removed skill_range_leniency [celest] + * Removed enable_upper_class [celest] + * Removed riding_weight [celest] + * Added signal handler for SIGPIPE [celest] + * Updated Frost Joke to affect everyone else in PvP/GvG, thanks to veider + * Corrected Detect Trap range to be based on level, thanks to veider + * Updated Tunnel Drive's movement speed, thanks to veider + * Removed cdp_rate, suggested by leinsirk10 + * Fixed a typo in Acid Terror, thanks to leinsirk10 + * Fixed some typos/memory leak in script cleaning up, thanks to leinsirk10 + * Added gm_can_drop_lv limitations for trading and opening storage, thanks to + Dino9021 + * Changed shop_exp's calculation to use 0.01% increments, suggested by tcdiem + * Refixed "--en/ja--" usage in 'monster' script not working properly, thanks + to sbilly + 03/21 * Moved /tool and /webserver to under /src and added 'make tools' and 'make web-server' [celest] @@ -86,8 +105,6 @@ Date Added - Should be made as an option of battle_athena.conf 03/11 - * Fixed "--en/ja--" usage in 'monster' script not working properly, thanks - to sbilly [celest] * Speedup player autosaving -- don't save guild castle data at the same time, thanks to Alex14 [celest] * Optimised guild castle saving when autosaving player data, thanks to Yor / diff --git a/conf-tmpl/battle_athena.conf b/conf-tmpl/battle_athena.conf index ef0802342..06f6a90ab 100644 --- a/conf-tmpl/battle_athena.conf +++ b/conf-tmpl/battle_athena.conf @@ -339,8 +339,9 @@ heal_exp: 0 // Experience calculations for the experience value * level difference of the person revived / 100 * resurrection_exp/10000 which the revived player has can be got. resurrection_exp: 0 -// The rate of job exp. when using discount and overcharge on an NPC (100 is normal, 200 is double.) -// The way it is calculated is (money recieved * skill lv) * shop_exp / 100. +// The rate of job exp. when using discount and overcharge on an NPC +// (in 0.01% increments - 100 is 1%, 10000 is normal, 20000 is double.) +// The way it is calculated is (money recieved * skill lv) * shop_exp / 10000. shop_exp: 0 // The delay rate of monk's combo (Note 2) @@ -791,10 +792,6 @@ mobs_level_up: no // Use kRO new steal formula? skill_steal_type: yes -// Sometimes when using skills while walking it'll fail because of range being too -// far, should we allow this to happen? (Setting this at 1 would be enough) -skill_range_leniency: 1 - // Set this to 1 if your clients have langtype problems and can't display motd properly motd_type: 0 diff --git a/conf-tmpl/msg_athena.conf b/conf-tmpl/msg_athena.conf index 7c9119dd6..afb482043 100644 --- a/conf-tmpl/msg_athena.conf +++ b/conf-tmpl/msg_athena.conf @@ -257,6 +257,14 @@ 243: Map skills are off 244: Map skills are on 245: Server Uptime: %ld days, %ld hours, %ld minutes, %ld seconds. +246: Your GM level don't authorise you to do this action. +247: You are not authorised to warp to this map. +248: You are not authorised to warp from your current map. +249: You are not authorised to warp to your save map. +250: You have already opened your storage. Close it first. +251: You have already opened your guild storage. Close it first. +252: You are not in a guild. +253: You are not authorised to memo this map. // Messages of others (not for GM commands) // ---------------------------------------- diff --git a/db/Changelog.txt b/db/Changelog.txt index 30a69ddd9..b995b3394 100644 --- a/db/Changelog.txt +++ b/db/Changelog.txt @@ -6,6 +6,7 @@ Skill databases == celest working on them i believe. 03/22 + * Corrected some typos in the items DB, thanks to Zoc [celest] * Added new items. Thanks to Landarma [Lupus] * skill CANNIBALIZE: fixed its upkeep time [Lupus] * Added Rafflesia into Dead Branch monsters list, removen all MVPs from there [Lupus] diff --git a/db/item_db.txt b/db/item_db.txt index aa0ab034e..40a5823ee 100644 --- a/db/item_db.txt +++ b/db/item_db.txt @@ -71,10 +71,10 @@ 568,Lemon,Lemon,0,20,0,20,,,,,0,3,,,,,{},{} 569,Novice's_Red_Potion,Novices Red Potion,0,50,0,70,,,,,10477567,2,,,,,{ itemheal rand(45,64),0; },{} // st.Valentine's Day Items -570,Fortune_Candy,Fortune Candy,0,10,0,30,,,,,10477567,2,,,,{ itemheal rand(45,64),0; },{} -571,Fortune_Candy_Cane,Fortune Candy Cane,0,20,0,40,,,,,10477567,2,,,,{ itemheal rand(105,144),0; },{} -572,Fortune_Cookie,Fortune Cookie,0,15,0,30,,,,,10477567,2,,,,{ itemheal rand(45,64),0; },{} -573,Chocolate_Drink,Chocolate Drink,0,20,0,150,,,,,10477567,2,,,,{ itemheal rand(105,144),0; },{} +570,Fortune_Candy,Fortune Candy,0,10,0,30,,,,,10477567,2,,,,,{ itemheal rand(45,64),0; },{} +571,Fortune_Candy_Cane,Fortune Candy Cane,0,20,0,40,,,,,10477567,2,,,,,{ itemheal rand(105,144),0; },{} +572,Fortune_Cookie,Fortune Cookie,0,15,0,30,,,,,10477567,2,,,,,{ itemheal rand(45,64),0; },{} +573,Chocolate_Drink,Chocolate Drink,0,20,0,150,,,,,10477567,2,,,,,{ itemheal rand(105,144),0; },{} 574,Egg,Egg,0,0,,30,,,,,10477567,2,,,,,{ itemheal rand(16,21),0; },{} // Usable Items @@ -1781,17 +1781,17 @@ 7303,Rice_Bag,Rice Straw Bag,3,20,0,800,,,,,,,,,,,{},{} // 2005 -7304,Witchs_Spellbook,Witch's Spellbook,3,20,0,10,0,0,0,0,0,0,0,0,0,0,0,{},{} -7305,Unknown_item,Authority of 9 worlds,3,20,0,10,0,0,0,0,0,0,0,0,0,0,0,{},{} -7306,Piece_of_Soul,Piece of Soul,3,20,0,10,0,0,0,0,0,0,0,0,0,0,0,{},{} -7307,Whisper_of_Soul,Whisper of Soul,3,20,0,10,0,0,0,0,0,0,0,0,0,0,0,{},{} -7308,Witchs_Potion,Witch's Potion,3,20,0,10,0,0,0,0,0,0,0,0,0,0,0,{},{} -7309,Crows_Wing,Crow's Wing,3,20,0,10,0,0,0,0,0,0,0,0,0,0,0,{},{} -7310,Peco_Coupon,Pecopeco Free Coupon,3,20,0,10,0,0,0,0,0,0,0,0,0,0,0,{},{} -7311,Airship_Coupon,Airship Free Coupon,3,20,0,10,0,0,0,0,0,0,0,0,0,0,0,{},{} -7312,Jubile,Jubilaeum,3,20,0,10,0,0,0,0,0,0,0,0,0,0,0,{},{} -7313,Witch\'s_Voucher,Witch's Voucher,3,20,0,10,0,0,0,0,0,0,0,0,0,0,0,{},{} -7314,The_Sign,The Sign,3,20,0,10,0,0,0,0,0,0,0,0,0,0,0,{},{} +7304,Witchs_Spellbook,Witch's Spellbook,3,20,0,10,0,0,0,0,0,0,0,0,0,0,{},{} +7305,Unknown_item,Authority of 9 worlds,3,20,0,10,0,0,0,0,0,0,0,0,0,0,{},{} +7306,Piece_of_Soul,Piece of Soul,3,20,0,10,0,0,0,0,0,0,0,0,0,0,{},{} +7307,Whisper_of_Soul,Whisper of Soul,3,20,0,10,0,0,0,0,0,0,0,0,0,0,{},{} +7308,Witchs_Potion,Witch's Potion,3,20,0,10,0,0,0,0,0,0,0,0,0,0,{},{} +7309,Crows_Wing,Crow's Wing,3,20,0,10,0,0,0,0,0,0,0,0,0,0,{},{} +7310,Peco_Coupon,Pecopeco Free Coupon,3,20,0,10,0,0,0,0,0,0,0,0,0,0,{},{} +7311,Airship_Coupon,Airship Free Coupon,3,20,0,10,0,0,0,0,0,0,0,0,0,0,{},{} +7312,Jubile,Jubilaeum,3,20,0,10,0,0,0,0,0,0,0,0,0,0,{},{} +7313,Witch\'s_Voucher,Witch's Voucher,3,20,0,10,0,0,0,0,0,0,0,0,0,0,{},{} +7314,The_Sign,The Sign,3,20,0,10,0,0,0,0,0,0,0,0,0,0,{},{} 7315,Black_Quartz_Piece,Piece of Black Quartz,3,,,10,0,0,0,0,0,0,0,0,0,0,0,{},{} 7316,Insect_Long_leg,Insect's Long Leg,3,,,10,0,0,0,0,0,0,0,0,0,0,0,{},{} diff --git a/npc/Changelog.txt b/npc/Changelog.txt index b1739129b..7a1a644e0 100644 --- a/npc/Changelog.txt +++ b/npc/Changelog.txt @@ -35,6 +35,8 @@ Other Ppl Date Added ====== +03/22 + * Moved position for Marx Hansen to payon_in03, thanks to Dino9021 [celest] 03/18 * Reduced label name length in heal_payment.txt [celest] * Added Sara-chan's Einbroch/Einbech city warps [celest] diff --git a/npc/quests/juice_maker.txt b/npc/quests/juice_maker.txt index a41d6ad0f..c94d9234d 100644 --- a/npc/quests/juice_maker.txt +++ b/npc/quests/juice_maker.txt @@ -181,7 +181,7 @@ L_Juice: } // Juicer Marx Hansen --------------------------------------------------------- -payon_in01.gat,5,48,7 script Juicer Marx Hansen 86,{ +payon_in03.gat,188,146,5 script Juicer Marx Hansen 86,{ mes "[Juicer Marx Hansen]"; if(MARIANNE == 1) goto L_Juice; mes "Welcome to my shop. What brings you here?"; diff --git a/src/common/core.c b/src/common/core.c index 02ba004ae..96d2c872b 100644 --- a/src/common/core.c +++ b/src/common/core.c @@ -76,7 +76,11 @@ sigfunc *compat_signal(int signo, sigfunc *func) * CORE : Signal Sub Function *-------------------------------------- */ - +// for handling certain signals ourselves, like SIGPIPE +static void sig_ignore(int sn) { + printf ("Broken pipe found... closing socket\n"); // set to eof in socket.c + return; // does nothing here +} static void sig_proc(int sn) { int i; @@ -137,8 +141,7 @@ void sig_dump(int sn) fprintf(fp, "Exception: %s \n", strsignal(sn)); fflush (fp); - - #ifdef CYGWIN + #ifdef CYGWIN cygwin_stackdump (); #else fprintf(fp, "Stack trace:\n"); @@ -153,7 +156,7 @@ void sig_dump(int sn) printf ("Done.\n"); fflush(stdout); - fclose(fp); + fclose(fp); } // Pass the signal to the system's default handler compat_signal(sn, SIG_DFL); @@ -289,7 +292,7 @@ int main(int argc,char **argv) Net_Init(); do_socket(); - compat_signal(SIGPIPE,SIG_IGN); + compat_signal(SIGPIPE, sig_ignore); compat_signal(SIGTERM,sig_proc); compat_signal(SIGINT,sig_proc); diff --git a/src/map/atcommand.c b/src/map/atcommand.c index 2964c8ce4..6f037c216 100644 --- a/src/map/atcommand.c +++ b/src/map/atcommand.c @@ -829,15 +829,11 @@ AtCommandType atcommand(struct map_session_data* sd, const int level, const char *------------------------------------------ */ static int atkillmonster_sub(struct block_list *bl, va_list ap) { - int flag = va_arg(ap, int); - - nullpo_retr(0, bl); - - if (flag) - mob_damage(NULL, (struct mob_data *)bl, ((struct mob_data *)bl)->hp, 2); - else - mob_delete((struct mob_data *)bl); + struct mob_data *md; + nullpo_retr(0, md=(struct mob_data *)bl); + mob_damage(NULL, md, md->hp, 2); + return 0; } /*========================================== @@ -893,34 +889,6 @@ static int atcommand_cleanmap_sub(struct block_list *bl,va_list ap) return 0; } -static int atkillnpc_sub(struct block_list *bl, va_list ap) -{ - int flag = va_arg(ap,int); - - nullpo_retr(0, bl); - - npc_delete((struct npc_data *)bl); - - flag = 0; - - return 0; -} - -void rehash( const int fd, struct map_session_data* sd ) -{ - int map_id = 0; - - int LOADED_MAPS = map_num; - - for (map_id = 0; map_id < LOADED_MAPS;map_id++) { - - if (map_id > LOADED_MAPS) - break; - - map_foreachinarea(atkillmonster_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_MOB, 0); - map_foreachinarea(atkillnpc_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_NPC, 0); - } -} /*========================================== * Read Message Data @@ -1078,11 +1046,11 @@ int atcommand_rura( if (x > 0 && x < 400 && y > 0 && y < 400) { m = map_mapname2mapid(map_name); if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to this map."); + clif_displaymessage(fd, msg_table[247]); return -1; } if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); + clif_displaymessage(fd, msg_table[248]); return -1; } if (pc_setpos(sd, map_name, x, y, 3) == 0) @@ -1161,11 +1129,11 @@ int atcommand_jumpto( if ((pl_sd = map_nick2sd(character)) != NULL) { if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to the map of this player."); + clif_displaymessage(fd, msg_table[247]); return -1; } if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); + clif_displaymessage(fd, msg_table[248]); return -1; } pc_setpos(sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3); @@ -1201,12 +1169,8 @@ int atcommand_jump( if (y <= 0) y = rand() % 399 + 1; if (x > 0 && x < 400 && y > 0 && y < 400) { - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to your actual map."); - return -1; - } - if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); + if (sd->bl.m >= 0 && (map[sd->bl.m].flag.nowarp || map[sd->bl.m].flag.nowarpto) && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { + clif_displaymessage(fd, msg_table[248]); return -1; } pc_setpos(sd, sd->mapname, x, y, 3); @@ -1815,11 +1779,11 @@ int atcommand_load( m = map_mapname2mapid(sd->status.save_point.map); if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to your save map."); + clif_displaymessage(fd, msg_table[249]); return -1; } if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); + clif_displaymessage(fd, msg_table[248]); return -1; } @@ -1878,12 +1842,12 @@ int atcommand_storage( nullpo_retr(-1, sd); if (sd->state.storage_flag == 1) { - clif_displaymessage(fd, "You have opened your guild storage. Close it before."); + clif_displaymessage(fd, msg_table[250]); return -1; } if ((stor = account2storage2(sd->status.account_id)) != NULL && stor->storage_status == 1) { - clif_displaymessage(fd, "You have already opened your storage."); + clif_displaymessage(fd, msg_table[250]); return -1; } @@ -1906,16 +1870,16 @@ int atcommand_guildstorage( if (sd->status.guild_id > 0) { if (sd->state.storage_flag == 1) { - clif_displaymessage(fd, "You have already opened your guild storage."); + clif_displaymessage(fd, msg_table[251]); return -1; } if ((stor = account2storage2(sd->status.account_id)) != NULL && stor->storage_status == 1) { - clif_displaymessage(fd, "Your storage is opened. Close it before."); + clif_displaymessage(fd, msg_table[251]); return -1; } storage_guild_storageopen(sd); } else { - clif_displaymessage(fd, "You are not in a guild."); + clif_displaymessage(fd, msg_table[252]); return -1; } @@ -3066,11 +3030,11 @@ int atcommand_go( if (sd->status.memo_point[-town-1].map[0]) { m = map_mapname2mapid(sd->status.memo_point[-town-1].map); if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to this memo map."); + clif_displaymessage(fd, msg_table[247]); return -1; } if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); + clif_displaymessage(fd, msg_table[248]); return -1; } if (pc_setpos(sd, sd->status.memo_point[-town-1].map, sd->status.memo_point[-town-1].x, sd->status.memo_point[-town-1].y, 3) == 0) { @@ -3087,11 +3051,11 @@ int atcommand_go( } else if (town >= 0 && town < (int)(sizeof(data) / sizeof(data[0]))) { m = map_mapname2mapid((char *)data[town].map); if (m >= 0 && map[m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to this destination map."); + clif_displaymessage(fd, msg_table[247]); return -1; } if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); + clif_displaymessage(fd, msg_table[248]); return -1; } if (pc_setpos(sd, (char *)data[town].map, data[town].x, data[town].y, 3) == 0) { @@ -3675,7 +3639,7 @@ int atcommand_memo( else { if (position >= MIN_PORTAL_MEMO && position <= MAX_PORTAL_MEMO) { if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to memo this map."); + clif_displaymessage(fd, msg_table[253]); return -1; } if (sd->status.memo_point[position].map[0]) { @@ -5697,15 +5661,24 @@ int atcommand_reloadskilldb( * *------------------------------------------ */ +void rehash(void) +{ + int map_id; + + for (map_id = 0; map_id < map_num; map_id++) { + map_foreachinarea(cleanup_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_MOB); + map_foreachinarea(cleanup_sub, map_id, 0, 0, map[map_id].xs, map[map_id].ys, BL_NPC); + } +} int atcommand_reloadscript( const int fd, struct map_session_data* sd, const char* command, const char* message) { nullpo_retr(-1, sd); - atcommand_broadcast( fd, sd, "@broadcast", "eAthena SQL Server is Rehashing..." ); + atcommand_broadcast( fd, sd, "@broadcast", "eAthena Server is Rehashing..." ); atcommand_broadcast( fd, sd, "@broadcast", "You will feel a bit of lag at this point !" ); - rehash( fd, sd ); + rehash(); atcommand_broadcast( fd, sd, "@broadcast", "Reloading NPCs..." ); do_init_npc(); @@ -8376,11 +8349,11 @@ int atcommand_jumptoid( { if ((pl_sd = session[session_id]->session_data) != NULL) { if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to the map of this player."); + clif_displaymessage(fd, msg_table[247]); return -1; } if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); + clif_displaymessage(fd, msg_table[248]); return -1; } pc_setpos(sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3); @@ -8431,11 +8404,11 @@ int atcommand_jumptoid2( { if ((pl_sd = session[session_id]->session_data) != NULL) { if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to the map of this player."); + clif_displaymessage(fd, msg_table[247]); return -1; } if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); + clif_displaymessage(fd, msg_table[248]); return -1; } pc_setpos(sd, pl_sd->mapname, pl_sd->bl.x, pl_sd->bl.y, 3); @@ -8486,11 +8459,11 @@ int atcommand_recallid( if ((pl_sd = session[session_id]->session_data) != NULL) { if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can recall only lower or same level if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to the map of this player."); + clif_displaymessage(fd, msg_table[247]); return -1; } if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); + clif_displaymessage(fd, msg_table[248]); return -1; } pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2); @@ -8545,11 +8518,11 @@ int atcommand_recallid2( if ((pl_sd = session[session_id]->session_data) != NULL) { if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can recall only lower or same level if (pl_sd->bl.m >= 0 && map[pl_sd->bl.m].flag.nowarpto && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you to the map of this player."); - return -1; + clif_displaymessage(fd, msg_table[247]); + return -1; } if (sd->bl.m >= 0 && map[sd->bl.m].flag.nowarp && battle_config.any_warp_GM_min_level > pc_isGM(sd)) { - clif_displaymessage(fd, "You are not authorised to warp you from your actual map."); + clif_displaymessage(fd, msg_table[248]); return -1; } pc_setpos(pl_sd, sd->mapname, sd->bl.x, sd->bl.y, 2); diff --git a/src/map/battle.c b/src/map/battle.c index 81b2c3189..3c3442c60 100644 --- a/src/map/battle.c +++ b/src/map/battle.c @@ -1441,7 +1441,7 @@ static struct Damage battle_calc_mob_weapon_attack( if( skill_num!=NPC_CRITICALSLASH ){ // 対 象の防御力によるダメージの減少 // ディバインプロテクション(ここでいいのかな?) - if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && skill_num != KN_AUTOCOUNTER && def1 < 1000000) { //DEF, VIT無視 + if ( skill_num != MO_INVESTIGATE && skill_num != MO_EXTREMITYFIST && skill_num != KN_AUTOCOUNTER && skill_num != AM_ACIDTERROR && def1 < 1000000) { //DEF, VIT無視 int t_def; target_count = 1 + battle_counttargeted(target,src,battle_config.vit_penalty_count_lv); if(battle_config.vit_penalty_type > 0) { @@ -3958,7 +3958,6 @@ static const struct { { "player_skillup_limit", &battle_config.skillup_limit }, { "weapon_produce_rate", &battle_config.wp_rate }, { "potion_produce_rate", &battle_config.pp_rate }, - { "deadly_potion_produce_rate", &battle_config.cdp_rate }, { "monster_active_enable", &battle_config.monster_active_enable }, { "monster_damage_delay_rate", &battle_config.monster_damage_delay_rate}, { "monster_loot_type", &battle_config.monster_loot_type }, @@ -4058,7 +4057,6 @@ static const struct { { "dead_branch_active", &battle_config.dead_branch_active }, { "vending_max_value", &battle_config.vending_max_value }, { "show_steal_in_same_party", &battle_config.show_steal_in_same_party }, - { "enable_upper_class", &battle_config.enable_upper_class }, { "pet_attack_attr_none", &battle_config.pet_attack_attr_none }, { "mob_attack_attr_none", &battle_config.mob_attack_attr_none }, { "mob_ghostring_fix", &battle_config.mob_ghostring_fix }, @@ -4075,7 +4073,6 @@ static const struct { { "skill_removetrap_type", &battle_config.skill_removetrap_type }, { "disp_experience", &battle_config.disp_experience }, { "castle_defense_rate", &battle_config.castle_defense_rate }, - { "riding_weight", &battle_config.riding_weight }, { "hp_rate", &battle_config.hp_rate }, { "sp_rate", &battle_config.sp_rate }, { "gm_can_drop_lv", &battle_config.gm_can_drop_lv }, @@ -4131,7 +4128,6 @@ static const struct { { "skill_steal_type", &battle_config.skill_steal_type}, // [celest] { "skill_steal_rate", &battle_config.skill_steal_rate}, // [celest] { "night_darkness_level", &battle_config.night_darkness_level}, // [celest] - { "skill_range_leniency", &battle_config.skill_range_leniency}, // [celest] { "motd_type", &battle_config.motd_type}, // [celest] { "allow_atcommand_when_mute", &battle_config.allow_atcommand_when_mute}, // [celest] { "finding_ore_rate", &battle_config.finding_ore_rate}, // [celest] @@ -4208,7 +4204,6 @@ void battle_set_defaults() { battle_config.skillup_limit = 0; battle_config.wp_rate=100; battle_config.pp_rate=100; - battle_config.cdp_rate=100; battle_config.monster_active_enable=1; battle_config.monster_damage_delay_rate=100; battle_config.monster_loot_type=0; @@ -4308,7 +4303,6 @@ void battle_set_defaults() { battle_config.dead_branch_active = 0; battle_config.vending_max_value = 10000000; battle_config.show_steal_in_same_party = 0; - battle_config.enable_upper_class = 0; battle_config.pet_attack_attr_none = 0; battle_config.pc_attack_attr_none = 0; battle_config.mob_attack_attr_none = 1; @@ -4325,7 +4319,6 @@ void battle_set_defaults() { battle_config.skill_removetrap_type = 0; battle_config.disp_experience = 0; battle_config.castle_defense_rate = 100; - battle_config.riding_weight = 0; battle_config.hp_rate = 100; battle_config.sp_rate = 100; battle_config.gm_can_drop_lv = 0; @@ -4380,7 +4373,6 @@ void battle_set_defaults() { battle_config.skill_steal_type = 1; battle_config.skill_steal_rate = 100; battle_config.night_darkness_level = 9; - battle_config.skill_range_leniency = 1; battle_config.motd_type = 0; battle_config.allow_atcommand_when_mute = 0; battle_config.finding_ore_rate = 100; @@ -4511,9 +4503,6 @@ void battle_validate_conf() { if (battle_config.night_darkness_level > 10) // Celest battle_config.night_darkness_level = 10; - if (battle_config.skill_range_leniency < 0) // Celest - battle_config.skill_range_leniency = 0; - if (battle_config.motd_type < 0) battle_config.motd_type = 0; else if (battle_config.motd_type > 1) diff --git a/src/map/battle.h b/src/map/battle.h index 63681360a..a4758ab80 100644 --- a/src/map/battle.h +++ b/src/map/battle.h @@ -131,7 +131,6 @@ extern struct Battle_Config { int skillup_limit; int wp_rate; int pp_rate; - int cdp_rate; int monster_active_enable; int monster_damage_delay_rate; int monster_loot_type; @@ -232,7 +231,6 @@ extern struct Battle_Config { // int pet_lootitem; // removed [Valaris] // int pet_weight; // removed [Valaris] int show_steal_in_same_party; - int enable_upper_class; int pet_attack_attr_none; int mob_attack_attr_none; int mob_ghostring_fix; @@ -273,7 +271,6 @@ extern struct Battle_Config { int skill_removetrap_type; int disp_experience; int castle_defense_rate; - int riding_weight; int backstab_bow_penalty; int hp_rate; int sp_rate; @@ -309,7 +306,6 @@ extern struct Battle_Config { int skill_steal_type; // [celest] int skill_steal_rate; // [celest] int night_darkness_level; // [celest] - int skill_range_leniency; // [celest] int motd_type; // [celest] int allow_atcommand_when_mute; // [celest] int finding_ore_rate; // orn diff --git a/src/map/itemdb.c b/src/map/itemdb.c index 82149946d..c37274cb9 100644 --- a/src/map/itemdb.c +++ b/src/map/itemdb.c @@ -929,13 +929,7 @@ static int itemdb_final(void *key,void *data,va_list ap) void itemdb_reload(void) { - /* - - <empty item databases> - itemdb_read(); - - */ - + numdb_final(item_db,itemdb_final); do_init_itemdb(); } diff --git a/src/map/map.c b/src/map/map.c index 1ee3840c7..60d41b84e 100644 --- a/src/map/map.c +++ b/src/map/map.c @@ -3120,7 +3120,7 @@ int map_db_final(void *k,void *d,va_list ap) } int nick_db_final(void *k,void *d,va_list ap){ return 0; } int charid_db_final(void *k,void *d,va_list ap){ return 0; } -static int cleanup_sub(struct block_list *bl, va_list ap) { +int cleanup_sub(struct block_list *bl, va_list ap) { nullpo_retr(0, bl); switch(bl->type) { diff --git a/src/map/map.h b/src/map/map.h index 8039615f7..aeb47136c 100644 --- a/src/map/map.h +++ b/src/map/map.h @@ -791,6 +791,8 @@ int path_blownpos(int m,int x0,int y0,int dx,int dy,int count); int map_who(int fd); +int cleanup_sub(struct block_list *bl, va_list ap); + void map_helpscreen(); // [Valaris] int map_delmap(char *mapname); diff --git a/src/map/mob.c b/src/map/mob.c index 3cfb4e6d5..7a39af029 100644 --- a/src/map/mob.c +++ b/src/map/mob.c @@ -4352,14 +4352,17 @@ static int mob_readdb_race(void) void mob_reload(void) { - /* - - <empty monster database> - mob_read(); - - */ +#ifndef TXT_ONLY + if(db_use_sqldbs) + mob_read_sqldb(); + else +#endif /* TXT_ONLY */ + mob_readdb(); - do_init_mob(); + mob_readdb_mobavail(); + mob_read_randommonster(); + mob_readskilldb(); + mob_readdb_race(); } #ifndef TXT_ONLY diff --git a/src/map/npc.c b/src/map/npc.c index 018ceae01..eb3f33ac5 100644 --- a/src/map/npc.c +++ b/src/map/npc.c @@ -1106,7 +1106,7 @@ int npc_buylist(struct map_session_data *sd,int n,unsigned short *item_list) if (sd->status.skill[MC_DISCOUNT].flag != 0) skill = sd->status.skill[MC_DISCOUNT].flag - 2; if (skill > 0) { - z = z * (double)skill * (double)battle_config.shop_exp/100.; + z = z * (double)skill * (double)battle_config.shop_exp/10000.; if (z < 1) z = 1; pc_gainexp(sd,0,(int)z); @@ -1166,7 +1166,7 @@ int npc_selllist(struct map_session_data *sd,int n,unsigned short *item_list) if (sd->status.skill[MC_OVERCHARGE].flag != 0) skill = sd->status.skill[MC_OVERCHARGE].flag - 2; if (skill > 0) { - z = z * (double)skill * (double)battle_config.shop_exp/100.; + z = z * (double)skill * (double)battle_config.shop_exp/10000.; if (z < 1) z = 1; pc_gainexp(sd,0,(int)z); @@ -2094,16 +2094,13 @@ int npc_parse_mob(char *w1,char *w2,char *w3,char *w4) md->bl.x=x; md->bl.y=y; - if(sscanf(w3,"%[^,],%d",mobname,&level) > 1) { - if(strcmp(mobname,"--en--")==0) - memcpy(md->name,mob_db[class_].name,24); - else if(strcmp(mobname,"--ja--")==0) - memcpy(md->name,mob_db[class_].jname,24); + if(sscanf(w3,"%[^,],%d",mobname,&level) > 1) md->level=level; - } - - else - memcpy(md->name,w3,24); + if(strcmp(mobname,"--en--")==0) + memcpy(md->name,mob_db[class_].name,24); + else if(strcmp(mobname,"--ja--")==0) + memcpy(md->name,mob_db[class_].jname,24); + else memcpy(md->name,mobname,24); md->n = i; md->base_class = md->class_ = class_; diff --git a/src/map/pc.c b/src/map/pc.c index 9e607f560..07e712dbe 100644 --- a/src/map/pc.c +++ b/src/map/pc.c @@ -978,13 +978,11 @@ int pc_calc_skilltree(struct map_session_data *sd) if(i==331) continue; sd->status.skill[i].id=i; } - if(battle_config.enable_upper_class){ //confで無?でなければ?み?む - for(i=355;i<411;i++) - sd->status.skill[i].id=i; - for(i=475;i<480;i++) - sd->status.skill[i].id=i; - } - }else{ + for(i=355;i<411;i++) + sd->status.skill[i].id=i; + for(i=475;i<480;i++) + sd->status.skill[i].id=i; + } else { do { flag=0; for(i=0;(id=skill_tree[s][c][i].id)>0;i++){ @@ -3611,10 +3609,6 @@ struct pc_base_job pc_calc_base_job(int b_class) bj.upper = 2; } - if(battle_config.enable_upper_class==0){ //confで無?になっていたらupper=0 - bj.upper = 0; - } - if(bj.job == 0){ bj.type = 0; }else if(bj.job < 7){ @@ -4355,12 +4349,10 @@ int pc_allskillup(struct map_session_data *sd) if(i==331) continue; sd->status.skill[i].lv=skill_get_max(i); } - if(battle_config.enable_upper_class){ //confで無?でなければ?み?む - for(i=355;i<411;i++) - sd->status.skill[i].lv=skill_get_max(i); - for(i=475;i<480;i++) - sd->status.skill[i].lv=skill_get_max(i); - } + for(i=355;i<411;i++) + sd->status.skill[i].lv=skill_get_max(i); + for(i=475;i<480;i++) + sd->status.skill[i].lv=skill_get_max(i); } else { for(i=0;(id=skill_tree[s][c][i].id)>0;i++){ diff --git a/src/map/script.c b/src/map/script.c index fd2068cbd..a732f7bc4 100644 --- a/src/map/script.c +++ b/src/map/script.c @@ -7833,11 +7833,11 @@ int do_final_script() if (script_config.die_event_name) aFree(script_config.die_event_name); if (script_config.kill_event_name) - aFree(script_config.die_event_name); + aFree(script_config.kill_event_name); if (script_config.login_event_name) - aFree(script_config.die_event_name); + aFree(script_config.login_event_name); if (script_config.logout_event_name) - aFree(script_config.die_event_name); + aFree(script_config.logout_event_name); return 0; } diff --git a/src/map/skill.c b/src/map/skill.c index b233f9c78..be8288beb 100644 --- a/src/map/skill.c +++ b/src/map/skill.c @@ -4812,7 +4812,7 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil case HT_DETECTING: /* ディテクティング */ { - const int range=7; + int range=skilllv*2+1; if(src->x!=x) x+=(src->x-x>0)?-range:range; if(src->y!=y) @@ -6915,14 +6915,13 @@ int skill_use_id( struct map_session_data *sd, int target_id, range = status_get_range(&sd->bl) - (range + 1); // be lenient if the skill was cast before we have moved to the correct position [Celest] if (sd->walktimer != -1) - range += battle_config.skill_range_leniency; + range++; else check_range_flag = 1; if(!battle_check_range(&sd->bl,bl,range)) { - if (check_range_flag && battle_check_range(&sd->bl,bl,range + battle_config.skill_range_leniency)) { - int dir, mask[8][2] = {{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}}; - dir = map_calc_dir(&sd->bl,bl->x,bl->y); - pc_walktoxy (sd, sd->bl.x + mask[dir][0] * battle_config.skill_range_leniency, - sd->bl.y + mask[dir][1] * battle_config.skill_range_leniency); + if (check_range_flag && battle_check_range(&sd->bl,bl,range + 1)) { + int mask[8][2] = {{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}}; + int dir = map_calc_dir(&sd->bl,bl->x,bl->y); + pc_walktoxy (sd, sd->bl.x + mask[dir][0], sd->bl.y + mask[dir][1]); } else return 0; } @@ -7177,14 +7176,13 @@ int skill_use_pos( struct map_session_data *sd, range = status_get_range(&sd->bl) - (range + 1); // be lenient if the skill was cast before we have moved to the correct position [Celest] if (sd->walktimer != -1) - range += battle_config.skill_range_leniency; + range ++; else check_range_flag = 1; if(!battle_check_range(&sd->bl,&bl,range)) { - if (check_range_flag && battle_check_range(&sd->bl,&bl,range + battle_config.skill_range_leniency)) { - int dir, mask[8][2] = {{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}}; - dir = map_calc_dir(&sd->bl,bl.x,bl.y); - pc_walktoxy (sd, sd->bl.x + mask[dir][0] * battle_config.skill_range_leniency, - sd->bl.y + mask[dir][1] * battle_config.skill_range_leniency); + if (check_range_flag && battle_check_range(&sd->bl,&bl,range + 1)) { + int mask[8][2] = {{0,1},{-1,1},{-1,0},{-1,-1},{0,-1},{1,-1},{1,0},{1,1}}; + int dir = map_calc_dir(&sd->bl,bl.x,bl.y); + pc_walktoxy (sd, sd->bl.x + mask[dir][0], sd->bl.y + mask[dir][1]); } else return 0; } @@ -7656,12 +7654,16 @@ int skill_frostjoke_scream(struct block_list *bl,va_list ap) if(src == bl)//自分には?かない return 0; - if(battle_check_target(src,bl,BCT_ENEMY) > 0) + if (map[src->m].flag.gvg || map[src->m].flag.pvp) skill_additional_effect(src,bl,skillnum,skilllv,BF_MISC,tick); - else if(battle_check_target(src,bl,BCT_PARTY) > 0) { - if(rand()%100 < 10)//PTメンバにも低確率でかかる(とりあえず10%) + // we freeze everybody except of ourselfes on pvp/gvg [veider] + else { + if(battle_check_target(src,bl,BCT_ENEMY) > 0) + skill_additional_effect(src,bl,skillnum,skilllv,BF_MISC,tick); + else if(battle_check_target(src,bl,BCT_PARTY) > 0 && rand()%100 < 10) skill_additional_effect(src,bl,skillnum,skilllv,BF_MISC,tick); } + // so on non-pvp/gvg we are just freezing as freezed before return 0; } @@ -8373,8 +8375,9 @@ int skill_unit_timer_sub( struct block_list *bl, va_list ap ) if(!unit->alive) return 0; + group=unit->group; - nullpo_retr(0, group=unit->group); + nullpo_retr(0, group); range = unit->range; /* onplace_timerイベント呼び出し */ @@ -8772,41 +8775,33 @@ int skill_produce_mix( struct map_session_data *sd, make_per += 500 + pc_checkskill(sd,AM_CP_WEAPON)*100 + pc_checkskill(sd,AM_CP_SHIELD)*100 + pc_checkskill(sd,AM_CP_ARMOR)*100 + pc_checkskill(sd,AM_CP_HELM)*100; else - make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300; + make_per = 1000 + sd->status.base_level*30 + sd->paramc[3]*20 + sd->paramc[4]*15 + pc_checkskill(sd,AM_LEARNINGPOTION)*100 + pc_checkskill(sd,AM_PHARMACY)*300; } else if (skill_produce_db[idx].req_skill == ASC_CDP) { - make_per = 2000 + 40*sd->paramc[4] + 20*sd->paramc[5]; - //make_per = 20 + (20*sd->paramc[4])/50 + (20*sd->paramc[5])/100; + make_per = 2000 + 40*sd->paramc[4] + 20*sd->paramc[5]; } else { if(nameid == 998) make_per = 1500 + sd->status.job_level*35 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,skill_produce_db[idx].req_skill)*600; else make_per = 1000 + sd->status.job_level*35 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,skill_produce_db[idx].req_skill)*500; } - } - else { // Corrected rates [DracoRPG] + if(battle_config.pp_rate != 100) + make_per = make_per * battle_config.pp_rate / 100; + } else { // Corrected rates [DracoRPG] int add_per=0; if(pc_search_inventory(sd,989) >= 0) add_per = 400; else if(pc_search_inventory(sd,988) >= 0) add_per = 300; else if(pc_search_inventory(sd,987) >= 0) add_per = 200; else if(pc_search_inventory(sd,986) >= 0) add_per = 100; - wlv = itemdb_wlv(nameid); - make_per = 1500 + sd->status.job_level*35 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,skill_produce_db[idx].req_skill)*1000 + pc_checkskill(sd,BS_WEAPONRESEARCH)*100 + - ((wlv >= 3)? pc_checkskill(sd,BS_ORIDEOCON)*100 : 0) + add_per - (ele? 2500:0) - sc*((4-wlv)*500) - wlv*1000; + wlv = itemdb_wlv(nameid); + make_per = 1500 + sd->status.job_level*35 + sd->paramc[4]*10 + sd->paramc[5]*10 + pc_checkskill(sd,skill_produce_db[idx].req_skill)*1000 + pc_checkskill(sd,BS_WEAPONRESEARCH)*100 + + ((wlv >= 3)? pc_checkskill(sd,BS_ORIDEOCON)*100 : 0) + add_per - (ele? 2500:0) - sc*((4-wlv)*500) - wlv*1000; + if(battle_config.wp_rate != 100) /* 確率補正 */ + make_per = make_per * battle_config.wp_rate / 100; } // -----------------------------------------------------// if(make_per < 1) make_per = 1; - if(skill_produce_db[idx].req_skill==AM_PHARMACY || - skill_produce_db[idx].req_skill==ASC_CDP) { - if( battle_config.pp_rate!=100 ) - make_per=make_per*battle_config.pp_rate/100; - } - else { - if( battle_config.wp_rate!=100 ) /* 確率補正 */ - make_per=make_per*battle_config.wp_rate/100; - } - // if(battle_config.etc_log) // printf("make rate = %d\n",make_per); @@ -9556,14 +9551,9 @@ static int skill_read_skillspamount(void) void skill_reload(void) { - /* - - <empty skill database> - <?> - - */ - - do_init_skill(); + skill_readdb(); + if (battle_config.skill_sp_override_grffile) + skill_read_skillspamount(); } /*========================================== diff --git a/src/map/status.c b/src/map/status.c index e05d33909..a848f8a4a 100644 --- a/src/map/status.c +++ b/src/map/status.c @@ -921,7 +921,8 @@ int status_calc_pc(struct map_session_data* sd,int first) if( (skill=pc_checkskill(sd,BS_WEAPONRESEARCH))>0) // 武器?究の命中率?加 sd->hit += skill*2; if(sd->status.option&2 && (skill = pc_checkskill(sd,RG_TUNNELDRIVE))>0 ) // トンネルドライブ // トンネルドライブ - sd->speed += (1.2*DEFAULT_WALK_SPEED - skill*9); + sd->speed += (100-16)*skill*DEFAULT_WALK_SPEED/100; + //sd->speed += (1.2*DEFAULT_WALK_SPEED - skill*9); if (pc_iscarton(sd) && (skill=pc_checkskill(sd,MC_PUSHCART))>0) // カ?トによる速度低下 sd->speed += (10-skill) * (DEFAULT_WALK_SPEED * 0.1); else if (pc_isriding(sd)) { // ペコペコ?りによる速度?加 diff --git a/src/map/storage.c b/src/map/storage.c index b78510a92..5e3797740 100644 --- a/src/map/storage.c +++ b/src/map/storage.c @@ -3,15 +3,18 @@ #include <stdlib.h> #include <string.h> -#include "db.h" +#include "../common/db.h" +#include "../common/nullpo.h" +#include "../common/malloc.h" + #include "itemdb.h" #include "clif.h" #include "intif.h" #include "pc.h" #include "storage.h" #include "guild.h" -#include "nullpo.h" -#include "malloc.h" +#include "battle.h" +#include "atcommand.h" #ifdef MEMWATCH #include "memwatch.h" @@ -124,6 +127,10 @@ int storage_storageopen(struct map_session_data *sd) nullpo_retr(0, sd); + if(pc_isGM(sd) && pc_isGM(sd) < battle_config.gm_can_drop_lv) { + clif_displaymessage(sd->fd, msg_txt(246)); + return 1; + } if((stor = numdb_search(storage_db,sd->status.account_id)) != NULL) { if (stor->storage_status == 0) { stor->storage_status = 1; @@ -132,7 +139,7 @@ int storage_storageopen(struct map_session_data *sd) clif_storageequiplist(sd,stor); clif_updatestorageamount(sd,stor); return 0; - } + } } else intif_request_storage(sd->status.account_id); diff --git a/src/map/trade.c b/src/map/trade.c index 62dd65831..7709376fb 100644 --- a/src/map/trade.c +++ b/src/map/trade.c @@ -4,6 +4,7 @@ #include <stdio.h> #include <string.h> +#include "../common/nullpo.h" #include "clif.h" #include "itemdb.h" #include "map.h" @@ -16,8 +17,6 @@ #include "intif.h" #include "atcommand.h" -#include "nullpo.h" - /*========================================== * 取引要請を相手に送る *------------------------------------------ @@ -34,7 +33,10 @@ void trade_traderequest(struct map_session_data *sd, int target_id) { return; } } - if ((target_sd->trade_partner != 0) || (sd->trade_partner != 0)) { + if(pc_isGM(sd) && pc_isGM(sd) < battle_config.gm_can_drop_lv) { + clif_displaymessage(sd->fd, msg_txt(246)); + trade_tradecancel(sd); // GM is not allowed to trade + } else if ((target_sd->trade_partner != 0) || (sd->trade_partner != 0)) { trade_tradecancel(sd); // person is in another trade } else { if (sd->bl.m != target_sd->bl.m || |