Various fixs

Fix bugreport:8418 (possible mapcrash from custom instance script)
Fix bugreport:8439 (pc_bonus_item_drop typos) thx to Baalberith
Fix some errors detected by cppcheck
upd install.sh (leftover of svn and wrong simlink)
This commit is contained in:
lighta 2014-01-07 20:15:40 -05:00
parent b8f6c37f5a
commit d6caec1c51
21 changed files with 134 additions and 121 deletions

View File

@ -2,18 +2,36 @@
#source var/function #source var/function
. ./function.sh . ./function.sh
#read -p "WARNING: This target is experimental. Press Ctrl+C to cancel or Enter to continue." readEnterKey
# NOTE: This requires GNU getopt. On Mac OS X and FreeBSD, you have to install this
# separately; see below.
TEMP=`getopt -o d: -l destdir: -- "$@"`
if [ $? != 0 ] ; then echo "Terminating..." >&2 ; exit 1 ; fi
# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"
eval set -- "$TEMP"
while [ $# -gt 0 ]
do
case "$1" in
(-d | --destdir) PKG_PATH="$2"; shift;;
esac
shift
done
echo "destdir = $PKG_PATH "
check_inst_right check_inst_right
check_files check_files
read -p "WARNING: This target dis experimental. Press Ctrl+C to cancel or Enter to continue." readEnterKey
mkdir -p $PKG_PATH/bin/ mkdir -p $PKG_PATH/bin/
mkdir -p $PKG_PATH/etc/$PKG/ mkdir -p $PKG_PATH/etc/$PKG/conf
mkdir -p $PKG_PATH/var/$PKG/ mkdir -p $PKG_PATH/var/$PKG/log
#we copy all file into opt/ dir and treat dir like normal unix arborescence #we copy all file into opt/ dir and treat dir like normal unix arborescence
rsync -r --exclude .svn db/ $PKG_PATH/var/$PKG/db cp -r db/ $PKG_PATH/var/$PKG/db
rsync -r --exclude .svn log/ $PKG_PATH/var/$PKG/log if [ -d log ]; then cp -r log/ $PKG_PATH/var/$PKG/log; fi
rsync -r --exclude .svn conf/ $PKG_PATH/etc/$PKG/conf cp -r conf/ $PKG_PATH/etc/$PKG/conf
rsync -r --exclude .svn npc/ $PKG_PATH/npc cp -r npc/ $PKG_PATH/npc
cp athena-start $PKG_PATH/ cp athena-start $PKG_PATH/
mv *-server* $PKG_PATH/bin/ mv *-server* $PKG_PATH/bin/

View File

@ -5350,7 +5350,7 @@ int char_lan_config_read(const char *lancfgName)
if ((line[0] == '/' && line[1] == '/') || line[0] == '\n' || line[1] == '\n') if ((line[0] == '/' && line[1] == '/') || line[0] == '\n' || line[1] == '\n')
continue; continue;
if(sscanf(line,"%[^:]: %[^:]:%[^:]:%[^\r\n]", w1, w2, w3, w4) != 4) { if(sscanf(line,"%63[^:]: %63[^:]:%63[^:]:%63[^\r\n]", w1, w2, w3, w4) != 4) {
ShowWarning("Error syntax of configuration file %s in line %d.\n", lancfgName, line_num); ShowWarning("Error syntax of configuration file %s in line %d.\n", lancfgName, line_num);
continue; continue;
@ -5398,7 +5398,7 @@ void sql_config_read(const char* cfgName)
if(line[0] == '/' && line[1] == '/') if(line[0] == '/' && line[1] == '/')
continue; continue;
if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2) if (sscanf(line, "%1023[^:]: %1023[^\r\n]", w1, w2) != 2)
continue; continue;
if(!strcmpi(w1,"char_db")) if(!strcmpi(w1,"char_db"))
@ -5487,7 +5487,7 @@ int char_config_read(const char* cfgName)
if (line[0] == '/' && line[1] == '/') if (line[0] == '/' && line[1] == '/')
continue; continue;
if (sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2) if (sscanf(line, "%1023[^:]: %1023[^\r\n]", w1, w2) != 2)
continue; continue;
remove_control_chars(w1); remove_control_chars(w1);

View File

@ -227,12 +227,10 @@ int inter_guild_tosql(struct guild *g,int flag)
if (flag&GS_MEMBER) if (flag&GS_MEMBER)
{ {
struct guild_member *m;
strcat(t_info, " members"); strcat(t_info, " members");
// Update only needed players // Update only needed players
for(i=0;i<g->max_member;i++){ for(i=0;i<g->max_member;i++){
m = &g->member[i]; struct guild_member *m = &g->member[i];
if (!m->modified) if (!m->modified)
continue; continue;
if(m->account_id) { if(m->account_id) {

View File

@ -268,7 +268,7 @@ const char *get_git_hash (void) {
char line[64]; char line[64];
char *rev = malloc(sizeof(char) * 50); char *rev = malloc(sizeof(char) * 50);
if( fgets(line, sizeof(line), fp) && sscanf(line, "%s", rev) ) if( fgets(line, sizeof(line), fp) && sscanf(line, "%40s", rev) )
snprintf(GitHash, sizeof(GitHash), "%s", rev); snprintf(GitHash, sizeof(GitHash), "%s", rev);
free(rev); free(rev);
@ -370,12 +370,10 @@ int main (int argc, char **argv)
do_init(argc,argv); do_init(argc,argv);
{// Main runtime cycle // Main runtime cycle
int next; while (runflag != CORE_ST_STOP) {
while (runflag != CORE_ST_STOP) { int next = do_timer(gettick_nocache());
next = do_timer(gettick_nocache()); do_sockets(next);
do_sockets(next);
}
} }
do_final(); do_final();

View File

@ -640,7 +640,7 @@ static bool grfio_parse_restable_row(const char* row)
char local[256]; char local[256];
FILELIST* entry; FILELIST* entry;
if( sscanf(row, "%[^#\r\n]#%[^#\r\n]#", w1, w2) != 2 ) if( sscanf(row, "%255[^#\r\n]#%255[^#\r\n]#", w1, w2) != 2 )
return false; return false;
if( strstr(w2, ".gat") == NULL && strstr(w2, ".rsw") == NULL ) if( strstr(w2, ".gat") == NULL && strstr(w2, ".rsw") == NULL )
@ -790,7 +790,7 @@ void grfio_init(const char* fname)
if( line[0] == '/' && line[1] == '/' ) if( line[0] == '/' && line[1] == '/' )
continue; // skip comments continue; // skip comments
if( sscanf(line, "%[^:]: %[^\r\n]", w1, w2) != 2 ) if( sscanf(line, "%1023[^:]: %1023[^\r\n]", w1, w2) != 2 )
continue; // skip unrecognized lines continue; // skip unrecognized lines
// Entry table reading // Entry table reading

View File

@ -115,8 +115,6 @@ void aFree_(void *p, const char *file, int line, const char *func)
// ShowMessage("%s:%d: in func %s: aFree %p\n",file,line,func,p); // ShowMessage("%s:%d: in func %s: aFree %p\n",file,line,func,p);
if (p) if (p)
FREE(p, file, line, func); FREE(p, file, line, func);
p = NULL;
} }
@ -447,13 +445,13 @@ void _mfree(void *ptr, const char *file, int line, const char *func )
/* Allocating blocks */ /* Allocating blocks */
static struct block* block_malloc(unsigned short hash) static struct block* block_malloc(unsigned short hash)
{ {
int i;
struct block *p; struct block *p;
if(hash_unfill[0] != NULL) { if(hash_unfill[0] != NULL) {
/* Space for the block has already been secured */ /* Space for the block has already been secured */
p = hash_unfill[0]; p = hash_unfill[0];
hash_unfill[0] = hash_unfill[0]->unfill_next; hash_unfill[0] = hash_unfill[0]->unfill_next;
} else { } else {
int i;
/* Newly allocated space for the block */ /* Newly allocated space for the block */
p = (struct block*)MALLOC(sizeof(struct block) * (BLOCK_ALLOC), __FILE__, __LINE__, __func__ ); p = (struct block*)MALLOC(sizeof(struct block) * (BLOCK_ALLOC), __FILE__, __LINE__, __func__ );
if(p == NULL) { if(p == NULL) {

View File

@ -1297,12 +1297,10 @@ int socket_getips(uint32* ips, int max)
else else
{ {
int pos; int pos;
struct ifreq* ir;
struct sockaddr_in* a;
for( pos=0; pos < ic.ifc_len && num < max; ) for( pos=0; pos < ic.ifc_len && num < max; )
{ {
ir = (struct ifreq*)(buf+pos); struct ifreq* ir = (struct ifreq*)(buf+pos);
a = (struct sockaddr_in*) &(ir->ifr_addr); struct sockaddr_in*a = (struct sockaddr_in*) &(ir->ifr_addr);
if( a->sin_family == AF_INET ){ if( a->sin_family == AF_INET ){
ad = ntohl(a->sin_addr.s_addr); ad = ntohl(a->sin_addr.s_addr);
if( ad != INADDR_LOOPBACK && ad != INADDR_ANY ) if( ad != INADDR_LOOPBACK && ad != INADDR_ANY )

View File

@ -433,7 +433,7 @@ ACMD_FUNC(where)
nullpo_retr(-1, sd); nullpo_retr(-1, sd);
memset(atcmd_player_name, '\0', sizeof atcmd_player_name); memset(atcmd_player_name, '\0', sizeof atcmd_player_name);
if (!message || !*message || sscanf(message, "%23[^\n]", atcmd_player_name) < 1) { if (!message || !*message || sscanf(message, "%23s[^\n]", atcmd_player_name) < 1) {
clif_displaymessage(fd, msg_txt(sd,910)); // Please enter a player name (usage: @where <char name>). clif_displaymessage(fd, msg_txt(sd,910)); // Please enter a player name (usage: @where <char name>).
return -1; return -1;
} }
@ -4373,12 +4373,12 @@ ACMD_FUNC(loadnpc)
ACMD_FUNC(unloadnpc) ACMD_FUNC(unloadnpc)
{ {
struct npc_data *nd; struct npc_data *nd;
char NPCname[NAME_LENGTH+1]; char NPCname[NAME_LENGTH];
nullpo_retr(-1, sd); nullpo_retr(-1, sd);
memset(NPCname, '\0', sizeof(NPCname)); memset(NPCname, '\0', sizeof(NPCname));
if (!message || !*message || sscanf(message, "%24[^\n]", NPCname) < 1) { if (!message || !*message || sscanf(message, "%23[^\n]", NPCname) < 1) {
clif_displaymessage(fd, msg_txt(sd,1133)); // Please enter a NPC name (usage: @unloadnpc <NPC_name>). clif_displaymessage(fd, msg_txt(sd,1133)); // Please enter a NPC name (usage: @unloadnpc <NPC_name>).
return -1; return -1;
} }

View File

@ -727,9 +727,9 @@ void chrif_authfail(int fd) {/* HELLO WORLD. ip in RFIFOL 15 is not being used (
*/ */
int auth_db_cleanup_sub(DBKey key, DBData *data, va_list ap) { int auth_db_cleanup_sub(DBKey key, DBData *data, va_list ap) {
struct auth_node *node = db_data2ptr(data); struct auth_node *node = db_data2ptr(data);
const char* states[] = { "Login", "Logout", "Map change" };
if(DIFF_TICK(gettick(),node->node_created)>60000) { if(DIFF_TICK(gettick(),node->node_created)>60000) {
const char* states[] = { "Login", "Logout", "Map change" };
switch (node->state) { switch (node->state) {
case ST_LOGOUT: case ST_LOGOUT:
//Re-save attempt (->sd should never be null here). //Re-save attempt (->sd should never be null here).
@ -1335,7 +1335,6 @@ int chrif_load_scdata(int fd) {
#ifdef ENABLE_SC_SAVING #ifdef ENABLE_SC_SAVING
struct map_session_data *sd; struct map_session_data *sd;
struct status_change_data *data;
int aid, cid, i, count; int aid, cid, i, count;
aid = RFIFOL(fd,4); //Player Account ID aid = RFIFOL(fd,4); //Player Account ID
@ -1356,7 +1355,7 @@ int chrif_load_scdata(int fd) {
count = RFIFOW(fd,12); //sc_count count = RFIFOW(fd,12); //sc_count
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
data = (struct status_change_data*)RFIFOP(fd,14 + i*sizeof(struct status_change_data)); struct status_change_data *data = (struct status_change_data*)RFIFOP(fd,14 + i*sizeof(struct status_change_data));
status_change_start(NULL,&sd->bl, (sc_type)data->type, 10000, data->val1, data->val2, data->val3, data->val4, data->tick, 1|2|4|8); status_change_start(NULL,&sd->bl, (sc_type)data->type, 10000, data->val1, data->val2, data->val3, data->val4, data->tick, 1|2|4|8);
} }
#endif #endif
@ -1367,13 +1366,11 @@ int chrif_load_scdata(int fd) {
int chrif_skillcooldown_load(int fd) { int chrif_skillcooldown_load(int fd) {
struct map_session_data *sd; struct map_session_data *sd;
struct skill_cooldown_data *data;
int aid, cid, i, count; int aid, cid, i, count;
aid = RFIFOL(fd, 4); aid = RFIFOL(fd, 4);
cid = RFIFOL(fd, 8); cid = RFIFOL(fd, 8);
sd = map_id2sd(aid); sd = map_id2sd(aid);
if (!sd) { if (!sd) {
ShowError("chrif_skillcooldown_load: Player of AID %d not found!\n", aid); ShowError("chrif_skillcooldown_load: Player of AID %d not found!\n", aid);
@ -1385,7 +1382,7 @@ int chrif_skillcooldown_load(int fd) {
} }
count = RFIFOW(fd, 12); //sc_count count = RFIFOW(fd, 12); //sc_count
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
data = (struct skill_cooldown_data*) RFIFOP(fd, 14 + i * sizeof (struct skill_cooldown_data)); struct skill_cooldown_data *data = (struct skill_cooldown_data*) RFIFOP(fd, 14 + i * sizeof (struct skill_cooldown_data));
skill_blockpc_start(sd, data->skill_id, data->tick); skill_blockpc_start(sd, data->skill_id, data->tick);
} }
return 0; return 0;
@ -1565,7 +1562,7 @@ void chrif_parse_ack_vipActive(int fd) {
* *
*------------------------------------------*/ *------------------------------------------*/
int chrif_parse(int fd) { int chrif_parse(int fd) {
int packet_len, cmd; int packet_len;
// only process data from the char-server // only process data from the char-server
if ( fd != char_fd ) { if ( fd != char_fd ) {
@ -1590,7 +1587,7 @@ int chrif_parse(int fd) {
} }
while ( RFIFOREST(fd) >= 2 ) { while ( RFIFOREST(fd) >= 2 ) {
cmd = RFIFOW(fd,0); int cmd = RFIFOW(fd,0);
if (cmd < 0x2af8 || cmd >= 0x2af8 + ARRAYLENGTH(packet_len_table) || packet_len_table[cmd-0x2af8] == 0) { if (cmd < 0x2af8 || cmd >= 0x2af8 + ARRAYLENGTH(packet_len_table) || packet_len_table[cmd-0x2af8] == 0) {
int r = intif_parse(fd); // Passed on to the intif int r = intif_parse(fd); // Passed on to the intif

View File

@ -1415,7 +1415,7 @@ void clif_hominfo(struct map_session_data *sd, struct homun_data *hd, int flag)
WBUFW(buf,31)=(unsigned short) (hd->homunculus.intimacy / 100) ; WBUFW(buf,31)=(unsigned short) (hd->homunculus.intimacy / 100) ;
WBUFW(buf,33)=0; // equip id WBUFW(buf,33)=0; // equip id
WBUFW(buf,35)=cap_value(status->rhw.atk2+status->batk, 0, INT16_MAX); WBUFW(buf,35)=cap_value(status->rhw.atk2+status->batk, 0, INT16_MAX);
WBUFW(buf,37)=cap_value(status->matk_max, 0, INT16_MAX); WBUFW(buf,37)=min(status->matk_max, INT16_MAX); //FIXME capping to INT16 here is too late
WBUFW(buf,39)=status->hit; WBUFW(buf,39)=status->hit;
if (battle_config.hom_setting&0x10) if (battle_config.hom_setting&0x10)
WBUFW(buf,41)=status->luk/3 + 1; //crit is a +1 decimal value! Just display purpose.[Vicious] WBUFW(buf,41)=status->luk/3 + 1; //crit is a +1 decimal value! Just display purpose.[Vicious]
@ -13623,7 +13623,7 @@ void clif_blacksmith(struct map_session_data* sd)
WFIFOHEAD(fd,packet_len(0x219)); WFIFOHEAD(fd,packet_len(0x219));
WFIFOW(fd,0) = 0x219; WFIFOW(fd,0) = 0x219;
//Packet size limits this list to 10 elements. [Skotlex] //Packet size limits this list to 10 elements. [Skotlex]
for (i = 0; i < 10 && i < MAX_FAME_LIST; i++) { for (i = 0; i < min(10,MAX_FAME_LIST); i++) { //client is capped to 10 char
if (smith_fame_list[i].id > 0) { if (smith_fame_list[i].id > 0) {
if (strcmp(smith_fame_list[i].name, "-") == 0 && if (strcmp(smith_fame_list[i].name, "-") == 0 &&
(name = map_charid2nick(smith_fame_list[i].id)) != NULL) (name = map_charid2nick(smith_fame_list[i].id)) != NULL)
@ -13676,7 +13676,7 @@ void clif_alchemist(struct map_session_data* sd)
WFIFOHEAD(fd,packet_len(0x21a)); WFIFOHEAD(fd,packet_len(0x21a));
WFIFOW(fd,0) = 0x21a; WFIFOW(fd,0) = 0x21a;
//Packet size limits this list to 10 elements. [Skotlex] //Packet size limits this list to 10 elements. [Skotlex]
for (i = 0; i < 10 && i < MAX_FAME_LIST; i++) { for (i = 0; i < min(10,MAX_FAME_LIST); i++) {
if (chemist_fame_list[i].id > 0) { if (chemist_fame_list[i].id > 0) {
if (strcmp(chemist_fame_list[i].name, "-") == 0 && if (strcmp(chemist_fame_list[i].name, "-") == 0 &&
(name = map_charid2nick(chemist_fame_list[i].id)) != NULL) (name = map_charid2nick(chemist_fame_list[i].id)) != NULL)
@ -13729,7 +13729,7 @@ void clif_taekwon(struct map_session_data* sd)
WFIFOHEAD(fd,packet_len(0x226)); WFIFOHEAD(fd,packet_len(0x226));
WFIFOW(fd,0) = 0x226; WFIFOW(fd,0) = 0x226;
//Packet size limits this list to 10 elements. [Skotlex] //Packet size limits this list to 10 elements. [Skotlex]
for (i = 0; i < 10 && i < MAX_FAME_LIST; i++) { for (i = 0; i < min(10,MAX_FAME_LIST); i++) {
if (taekwon_fame_list[i].id > 0) { if (taekwon_fame_list[i].id > 0) {
if (strcmp(taekwon_fame_list[i].name, "-") == 0 && if (strcmp(taekwon_fame_list[i].name, "-") == 0 &&
(name = map_charid2nick(taekwon_fame_list[i].id)) != NULL) (name = map_charid2nick(taekwon_fame_list[i].id)) != NULL)
@ -15756,7 +15756,7 @@ void clif_instance_status(struct map_session_data *sd, const char *name, unsigne
#if PACKETVER >= 20071128 #if PACKETVER >= 20071128
unsigned char buf[71]; unsigned char buf[71];
nullpo_retv(sd); if(!sd) return; //party_getavailablesd can return NULL
WBUFW(buf,0) = 0x2cd; WBUFW(buf,0) = 0x2cd;
safestrncpy( WBUFP(buf,2), name, 62 ); safestrncpy( WBUFP(buf,2), name, 62 );
@ -16914,7 +16914,7 @@ void clif_sub_ranklist(unsigned char *buf,int idx,struct map_session_data* sd, i
if(!skip){ if(!skip){
//Packet size limits this list to 10 elements. [Skotlex] //Packet size limits this list to 10 elements. [Skotlex]
for (i = 0; i < 10 && i < MAX_FAME_LIST; i++) { for (i = 0; i < min(10,MAX_FAME_LIST); i++) {
if (list[i].id > 0) { if (list[i].id > 0) {
if (strcmp(list[i].name, "-") == 0 && if (strcmp(list[i].name, "-") == 0 &&
(name = map_charid2nick(list[i].id)) != NULL) (name = map_charid2nick(list[i].id)) != NULL)
@ -17854,7 +17854,7 @@ void packetdb_readdb(void)
ln++; ln++;
if(line[0]=='/' && line[1]=='/') if(line[0]=='/' && line[1]=='/')
continue; continue;
if (sscanf(line,"%256[^:]: %256[^\r\n]",w1,w2) == 2) if (sscanf(line,"%255[^:]: %255[^\r\n]",w1,w2) == 2)
{ {
if(strcmpi(w1,"packet_ver")==0) { if(strcmpi(w1,"packet_ver")==0) {
int prev_ver = packet_ver; int prev_ver = packet_ver;

View File

@ -1282,9 +1282,7 @@ int read_homunculus_skilldb(void)
void read_homunculus_expdb(void) void read_homunculus_expdb(void)
{ {
FILE *fp; int i;
char line[1024];
int i, j=0;
char *filename[]={ char *filename[]={
DBPATH"exp_homun.txt", DBPATH"exp_homun.txt",
"import/exp_homun.txt" "import/exp_homun.txt"
@ -1292,6 +1290,10 @@ void read_homunculus_expdb(void)
memset(hexptbl,0,sizeof(hexptbl)); memset(hexptbl,0,sizeof(hexptbl));
for(i=0; i<ARRAYLENGTH(filename); i++){ for(i=0; i<ARRAYLENGTH(filename); i++){
FILE *fp;
char line[1024];
int j=0;
sprintf(line, "%s/%s", db_path, filename[i]); sprintf(line, "%s/%s", db_path, filename[i]);
fp=fopen(line,"r"); fp=fopen(line,"r");
if(fp == NULL){ if(fp == NULL){

View File

@ -537,7 +537,7 @@ int log_config_read(const char* cfgName)
if( line[0] == '/' && line[1] == '/' ) if( line[0] == '/' && line[1] == '/' )
continue; continue;
if( sscanf(line, "%[^:]: %[^\r\n]", w1, w2) == 2 ) if( sscanf(line, "%1023[^:]: %1023[^\r\n]", w1, w2) == 2 )
{ {
if( strcmpi(w1, "enable_logs") == 0 ) if( strcmpi(w1, "enable_logs") == 0 )
log_config.enable_logs = (e_log_pick_type)config_switch(w2); log_config.enable_logs = (e_log_pick_type)config_switch(w2);

View File

@ -281,6 +281,7 @@ enum bl_type {
enum npc_subtype { WARP, SHOP, SCRIPT, CASHSHOP, ITEMSHOP, POINTSHOP, TOMB }; enum npc_subtype { WARP, SHOP, SCRIPT, CASHSHOP, ITEMSHOP, POINTSHOP, TOMB };
enum e_race { enum e_race {
RC_NONE=-1, //don't give us bonus
RC_FORMLESS=0, RC_FORMLESS=0,
RC_UNDEAD, RC_UNDEAD,
RC_BRUTE, RC_BRUTE,
@ -296,6 +297,7 @@ enum e_race {
}; };
enum e_classAE { enum e_classAE {
CLASS_NONE=-1, //don't give us bonus
CLASS_NORMAL = 0, CLASS_NORMAL = 0,
CLASS_BOSS, CLASS_BOSS,
CLASS_GUARDIAN, CLASS_GUARDIAN,

View File

@ -377,8 +377,8 @@ int mercenary_killbonus(struct mercenary_data *md)
int mercenary_kills(struct mercenary_data *md) int mercenary_kills(struct mercenary_data *md)
{ {
md->mercenary.kill_count++; if(md->mercenary.kill_count <= (INT_MAX-1)) //safe cap to INT_MAX
md->mercenary.kill_count = cap_value(md->mercenary.kill_count, 0, INT_MAX); md->mercenary.kill_count++;
if( (md->mercenary.kill_count % 50) == 0 ) if( (md->mercenary.kill_count % 50) == 0 )
{ {

View File

@ -98,15 +98,13 @@ int mob_skill_id2skill_idx(int mob_id,uint16 skill_id);
int mobdb_searchname(const char *str) int mobdb_searchname(const char *str)
{ {
int i; int i;
struct mob_db* mob;
for(i=0;i<=MAX_MOB_DB;i++){ for(i=0;i<=MAX_MOB_DB;i++){
mob = mob_db(i); struct mob_db *mob = mob_db(i);
if(mob == mob_dummy) //Skip dummy mobs. if(mob == mob_dummy) //Skip dummy mobs.
continue; continue;
if(strcmpi(mob->name,str)==0 || strcmpi(mob->jname,str)==0 || strcmpi(mob->sprite,str)==0) if(strcmpi(mob->name,str)==0 || strcmpi(mob->jname,str)==0 || strcmpi(mob->sprite,str)==0)
return i; return i;
} }
return 0; return 0;
} }
static int mobdb_searchname_array_sub(struct mob_db* mob, const char *str) static int mobdb_searchname_array_sub(struct mob_db* mob, const char *str)
@ -347,12 +345,9 @@ bool mob_ksprotected (struct block_list *src, struct block_list *target)
struct block_list *s_bl, *t_bl; struct block_list *s_bl, *t_bl;
struct map_session_data struct map_session_data
*sd, // Source *sd, // Source
*pl_sd, // Owner
*t_sd; // Mob Target *t_sd; // Mob Target
struct status_change_entry *sce;
struct mob_data *md; struct mob_data *md;
unsigned int tick = gettick(); unsigned int tick = gettick();
char output[128];
if( !battle_config.ksprotection ) if( !battle_config.ksprotection )
return false; // KS Protection Disabled return false; // KS Protection Disabled
@ -373,6 +368,10 @@ bool mob_ksprotected (struct block_list *src, struct block_list *target)
t_sd = BL_CAST(BL_PC,s_bl); t_sd = BL_CAST(BL_PC,s_bl);
do { do {
struct status_change_entry *sce;
struct map_session_data *pl_sd; // Owner
char output[128];
if( map[md->bl.m].flag.allowks || map_flag_ks(md->bl.m) ) if( map[md->bl.m].flag.allowks || map_flag_ks(md->bl.m) )
return false; // Ignores GVG, PVP and AllowKS map flags return false; // Ignores GVG, PVP and AllowKS map flags
@ -1340,7 +1339,7 @@ int mob_unlocktarget(struct mob_data *md, unsigned int tick)
int mob_randomwalk(struct mob_data *md,unsigned int tick) int mob_randomwalk(struct mob_data *md,unsigned int tick)
{ {
const int retrycount=20; const int retrycount=20;
int i,x,y,c,d; int i,c,d;
int speed; int speed;
nullpo_ret(md); nullpo_ret(md);
@ -1354,8 +1353,8 @@ int mob_randomwalk(struct mob_data *md,unsigned int tick)
if(d<5) d=5; if(d<5) d=5;
for(i=0;i<retrycount;i++){ // Search of a movable place for(i=0;i<retrycount;i++){ // Search of a movable place
int r=rnd(); int r=rnd();
x=r%(d*2+1)-d; int x=r%(d*2+1)-d;
y=r/(d*2+1)%(d*2+1)-d; int y=r/(d*2+1)%(d*2+1)-d;
x+=md->bl.x; x+=md->bl.x;
y+=md->bl.y; y+=md->bl.y;
@ -1828,10 +1827,11 @@ static struct item_drop* mob_setlootitem(struct item* item)
static int mob_delay_item_drop(int tid, unsigned int tick, int id, intptr_t data) static int mob_delay_item_drop(int tid, unsigned int tick, int id, intptr_t data)
{ {
struct item_drop_list *list; struct item_drop_list *list;
struct item_drop *ditem, *ditem_prev; struct item_drop *ditem;
list=(struct item_drop_list *)data; list=(struct item_drop_list *)data;
ditem = list->item; ditem = list->item;
while (ditem) { while (ditem) {
struct item_drop *ditem_prev;
map_addflooritem(&ditem->item_data,ditem->item_data.amount, map_addflooritem(&ditem->item_data,ditem->item_data.amount,
list->m,list->x,list->y, list->m,list->x,list->y,
list->first_charid,list->second_charid,list->third_charid,4); list->first_charid,list->second_charid,list->third_charid,4);
@ -2117,7 +2117,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
int id,zeny; int id,zeny;
unsigned int base_exp,job_exp; unsigned int base_exp,job_exp;
} pt[DAMAGELOG_SIZE]; } pt[DAMAGELOG_SIZE];
int i, temp, count, m = md->bl.m, pnum = 0; int i, temp, count, m = md->bl.m;
int dmgbltypes = 0; // bitfield of all bl types, that caused damage to the mob and are elligible for exp distribution int dmgbltypes = 0; // bitfield of all bl types, that caused damage to the mob and are elligible for exp distribution
unsigned int mvp_damage, tick = gettick(); unsigned int mvp_damage, tick = gettick();
bool rebirth, homkillonly; bool rebirth, homkillonly;
@ -2199,6 +2199,7 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
(!map[m].flag.nobaseexp || !map[m].flag.nojobexp) //Gives Exp (!map[m].flag.nobaseexp || !map[m].flag.nojobexp) //Gives Exp
) { //Experience calculation. ) { //Experience calculation.
int bonus = 100; //Bonus on top of your share (common to all attackers). int bonus = 100; //Bonus on top of your share (common to all attackers).
int pnum = 0;
if (md->sc.data[SC_RICHMANKIM]) if (md->sc.data[SC_RICHMANKIM])
bonus += md->sc.data[SC_RICHMANKIM]->val2; bonus += md->sc.data[SC_RICHMANKIM]->val2;
if(sd) { if(sd) {
@ -2437,12 +2438,10 @@ int mob_dead(struct mob_data *md, struct block_list *src, int type)
// process script-granted extra drop bonuses // process script-granted extra drop bonuses
int itemid = 0; int itemid = 0;
for (i = 0; i < ARRAYLENGTH(sd->add_drop) && (sd->add_drop[i].id || sd->add_drop[i].group); i++) { for (i = 0; i < ARRAYLENGTH(sd->add_drop) && (sd->add_drop[i].id || sd->add_drop[i].group); i++) {
if ( sd->add_drop[i].race == -md->mob_id || if ( sd->add_drop[i].race == -md->mob_id
( (sd->add_drop[i].race > 0 || sd->add_drop[i].class_ > 0) && ( || (sd->add_drop[i].race && (sd->add_drop[i].race)&(1<<status->race))
sd->add_drop[i].race & (1<<status->race) || || (sd->add_drop[i].class_ && (sd->add_drop[i].class_)&(1<<status->class_))
sd->add_drop[i].class_ & (1<<status->class_) ) {
)))
{
//check if the bonus item drop rate should be multiplied with mob level/10 [Lupus] //check if the bonus item drop rate should be multiplied with mob level/10 [Lupus]
if(sd->add_drop[i].rate < 0) { if(sd->add_drop[i].rate < 0) {
//it's negative, then it should be multiplied. e.g. for Mimic,Myst Case Cards, etc //it's negative, then it should be multiplied. e.g. for Mimic,Myst Case Cards, etc
@ -3382,7 +3381,7 @@ int mob_is_clone(int mob_id)
int mob_clone_spawn(struct map_session_data *sd, int16 m, int16 x, int16 y, const char *event, int master_id, int mode, int flag, unsigned int duration) int mob_clone_spawn(struct map_session_data *sd, int16 m, int16 x, int16 y, const char *event, int master_id, int mode, int flag, unsigned int duration)
{ {
int mob_id; int mob_id;
int i,j,inf,skill_id, fd; int i,j,inf, fd;
struct mob_data *md; struct mob_data *md;
struct mob_skill *ms; struct mob_skill *ms;
struct mob_db* db; struct mob_db* db;
@ -3434,7 +3433,7 @@ int mob_clone_spawn(struct map_session_data *sd, int16 m, int16 x, int16 y, cons
//Go Backwards to give better priority to advanced skills. //Go Backwards to give better priority to advanced skills.
for (i=0,j = MAX_SKILL_TREE-1;j>=0 && i< MAX_MOBSKILL ;j--) { for (i=0,j = MAX_SKILL_TREE-1;j>=0 && i< MAX_MOBSKILL ;j--) {
skill_id = skill_tree[pc_class2idx(sd->status.class_)][j].id; int skill_id = skill_tree[pc_class2idx(sd->status.class_)][j].id;
if (!skill_id || sd->status.skill[skill_id].lv < 1 || if (!skill_id || sd->status.skill[skill_id].lv < 1 ||
(skill_get_inf2(skill_id)&(INF2_WEDDING_SKILL|INF2_GUILD_SKILL)) || (skill_get_inf2(skill_id)&(INF2_WEDDING_SKILL|INF2_GUILD_SKILL)) ||
skill_get_nocast(skill_id)&16 skill_get_nocast(skill_id)&16
@ -3682,7 +3681,7 @@ static bool mob_parse_dbrow(char** str)
{ {
struct mob_db *db, entry; struct mob_db *db, entry;
struct status_data *status; struct status_data *status;
int mob_id, i, k; int mob_id, i;
double exp, maxhp; double exp, maxhp;
struct mob_data data; struct mob_data data;
@ -3847,7 +3846,7 @@ static bool mob_parse_dbrow(char** str)
int rate = 0, rate_adjust, type; int rate = 0, rate_adjust, type;
unsigned short ratemin, ratemax; unsigned short ratemin, ratemax;
struct item_data *id; struct item_data *id;
k = 31 + MAX_MVP_DROP*2 + i*2; int k = 31 + MAX_MVP_DROP*2 + i*2;
db->dropitem[i].nameid = atoi(str[k]); db->dropitem[i].nameid = atoi(str[k]);
if (!db->dropitem[i].nameid) { if (!db->dropitem[i].nameid) {
db->dropitem[i].p = 0; //No drop. db->dropitem[i].p = 0; //No drop.
@ -4040,10 +4039,7 @@ static bool mob_readdb_mobavail(char* str[], int columns, int current)
*------------------------------------------*/ *------------------------------------------*/
static int mob_read_randommonster(void) static int mob_read_randommonster(void)
{ {
FILE *fp; int i;
char line[1024];
char *str[10],*p;
int i,j, entries, k;
const char* mobfile[] = { const char* mobfile[] = {
DBPATH"mob_branch.txt", DBPATH"mob_branch.txt",
DBPATH"mob_poring.txt", DBPATH"mob_poring.txt",
@ -4061,7 +4057,11 @@ static int mob_read_randommonster(void)
for( i = 0; i < ARRAYLENGTH(mobfile); i++ ) for( i = 0; i < ARRAYLENGTH(mobfile); i++ )
{ // MobID,DummyName,Rate { // MobID,DummyName,Rate
entries=0; FILE *fp;
char line[1024];
char *str[10],*p;
int j, entries=0, k;
k = (i >= MAX_RANDOMMONSTER) ? i - MAX_RANDOMMONSTER : i; k = (i >= MAX_RANDOMMONSTER) ? i - MAX_RANDOMMONSTER : i;
mob_db_data[0]->summonper[k] = MOBID_PORING; // Default fallback value, in case the database does not provide one mob_db_data[0]->summonper[k] = MOBID_PORING; // Default fallback value, in case the database does not provide one
sprintf(line, "%s/%s", db_path, mobfile[i]); sprintf(line, "%s/%s", db_path, mobfile[i]);
@ -4493,7 +4493,7 @@ static int mob_read_sqlskilldb(void)
*------------------------------------------*/ *------------------------------------------*/
static bool mob_readdb_race2(char* fields[], int columns, int current) static bool mob_readdb_race2(char* fields[], int columns, int current)
{ {
int race, mobid, i; int race, i;
race = atoi(fields[0]); race = atoi(fields[0]);
@ -4505,7 +4505,7 @@ static bool mob_readdb_race2(char* fields[], int columns, int current)
for(i = 1; i<columns; i++) for(i = 1; i<columns; i++)
{ {
mobid = atoi(fields[i]); int mobid = atoi(fields[i]);
if (mob_db(mobid) == mob_dummy) if (mob_db(mobid) == mob_dummy)
{ {
ShowWarning("mob_readdb_race2: Unknown mob id %d for race2 %d.\n", mobid, race); ShowWarning("mob_readdb_race2: Unknown mob id %d for race2 %d.\n", mobid, race);

View File

@ -1915,10 +1915,10 @@ static int pc_bonus_item_drop(struct s_add_drop *drop, const short max, short id
if( if(
((id && drop[i].id == id) || ((id && drop[i].id == id) ||
(group && drop[i].group == group)) (group && drop[i].group == group))
&& (race > 0 || class_ > -1) && ((race<RC_NONE && race<RC_MAX) || (class_<CLASS_NONE && class_<CLASS_MAX))
) { ) {
drop[i].race |= race; if(race<RC_NONE && race<RC_MAX) drop[i].race |= 1<<race;
drop[i].class_ |= class_; if(class_<CLASS_NONE && class_<CLASS_MAX) drop[i].class_ |= 1<<class_;
if(drop[i].rate > 0 && rate > 0) if(drop[i].rate > 0 && rate > 0)
{ //Both are absolute rates. { //Both are absolute rates.
if (drop[i].rate < rate) if (drop[i].rate < rate)
@ -1939,8 +1939,8 @@ static int pc_bonus_item_drop(struct s_add_drop *drop, const short max, short id
} }
drop[i].id = id; drop[i].id = id;
drop[i].group = group; drop[i].group = group;
drop[i].race |= race; if(race<RC_NONE && race<RC_MAX) drop[i].race |= 1<<race;
drop[i].class_ |= class_; if(class_<CLASS_NONE && class_<CLASS_MAX) drop[i].class_ |= 1<<class_;
drop[i].rate = rate; drop[i].rate = rate;
return 1; return 1;
} }

View File

@ -114,7 +114,8 @@ struct s_addeffectonskill {
struct s_add_drop { struct s_add_drop {
short id, group; short id, group;
int race, rate, class_; int rate;
int race, class_; //bitwise value of 1<<x
}; };
struct s_autobonus { struct s_autobonus {

View File

@ -1651,9 +1651,9 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
for (i = 0; i < ARRAYLENGTH(sd->autospell) && sd->autospell[i].id; i++) { for (i = 0; i < ARRAYLENGTH(sd->autospell) && sd->autospell[i].id; i++) {
if(!(sd->autospell[i].flag&attack_type&BF_WEAPONMASK && if(!( ((sd->autospell[i].flag)&attack_type)&BF_WEAPONMASK &&
sd->autospell[i].flag&attack_type&BF_RANGEMASK && ((sd->autospell[i].flag)&attack_type)&BF_RANGEMASK &&
sd->autospell[i].flag&attack_type&BF_SKILLMASK)) ((sd->autospell[i].flag)&attack_type)&BF_SKILLMASK))
continue; // one or more trigger conditions were not fulfilled continue; // one or more trigger conditions were not fulfilled
skill = (sd->autospell[i].id > 0) ? sd->autospell[i].id : -sd->autospell[i].id; skill = (sd->autospell[i].id > 0) ? sd->autospell[i].id : -sd->autospell[i].id;
@ -1744,9 +1744,9 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, uint
continue; continue;
if( sd->autobonus[i].active != INVALID_TIMER ) if( sd->autobonus[i].active != INVALID_TIMER )
continue; continue;
if(!(sd->autobonus[i].atk_type&attack_type&BF_WEAPONMASK && if(!( ((sd->autobonus[i].atk_type)&attack_type)&BF_WEAPONMASK &&
sd->autobonus[i].atk_type&attack_type&BF_RANGEMASK && ((sd->autobonus[i].atk_type)&attack_type)&BF_RANGEMASK &&
sd->autobonus[i].atk_type&attack_type&BF_SKILLMASK)) ((sd->autobonus[i].atk_type)&attack_type)&BF_SKILLMASK))
continue; // one or more trigger conditions were not fulfilled continue; // one or more trigger conditions were not fulfilled
pc_exeautobonus(sd,&sd->autobonus[i]); pc_exeautobonus(sd,&sd->autobonus[i]);
} }
@ -1987,9 +1987,9 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list *
for (i = 0; i < ARRAYLENGTH(dstsd->autospell2) && dstsd->autospell2[i].id; i++) { for (i = 0; i < ARRAYLENGTH(dstsd->autospell2) && dstsd->autospell2[i].id; i++) {
if(!(dstsd->autospell2[i].flag&attack_type&BF_WEAPONMASK && if(!( ((dstsd->autospell2[i].flag)&attack_type)&BF_WEAPONMASK &&
dstsd->autospell2[i].flag&attack_type&BF_RANGEMASK && ((dstsd->autospell2[i].flag)&attack_type)&BF_RANGEMASK &&
dstsd->autospell2[i].flag&attack_type&BF_SKILLMASK)) ((dstsd->autospell2[i].flag)&attack_type)&BF_SKILLMASK))
continue; // one or more trigger conditions were not fulfilled continue; // one or more trigger conditions were not fulfilled
skill_id = (dstsd->autospell2[i].id > 0) ? dstsd->autospell2[i].id : -dstsd->autospell2[i].id; skill_id = (dstsd->autospell2[i].id > 0) ? dstsd->autospell2[i].id : -dstsd->autospell2[i].id;
@ -2073,9 +2073,9 @@ int skill_counter_additional_effect (struct block_list* src, struct block_list *
continue; continue;
if( dstsd->autobonus2[i].active != INVALID_TIMER ) if( dstsd->autobonus2[i].active != INVALID_TIMER )
continue; continue;
if(!(dstsd->autobonus2[i].atk_type&attack_type&BF_WEAPONMASK && if(!( ((dstsd->autobonus2[i].atk_type)&attack_type)&BF_WEAPONMASK &&
dstsd->autobonus2[i].atk_type&attack_type&BF_RANGEMASK && ((dstsd->autobonus2[i].atk_type)&attack_type)&BF_RANGEMASK &&
dstsd->autobonus2[i].atk_type&attack_type&BF_SKILLMASK)) ((dstsd->autobonus2[i].atk_type)&attack_type)&BF_SKILLMASK))
continue; // one or more trigger conditions were not fulfilled continue; // one or more trigger conditions were not fulfilled
pc_exeautobonus(dstsd,&dstsd->autobonus2[i]); pc_exeautobonus(dstsd,&dstsd->autobonus2[i]);
} }
@ -2095,7 +2095,7 @@ int skill_break_equip (struct block_list *src,struct block_list *bl, unsigned sh
const enum sc_type scatk[4] = {SC_STRIPWEAPON, SC_STRIPARMOR, SC_STRIPSHIELD, SC_STRIPHELM}; const enum sc_type scatk[4] = {SC_STRIPWEAPON, SC_STRIPARMOR, SC_STRIPSHIELD, SC_STRIPHELM};
const enum sc_type scdef[4] = {SC_CP_WEAPON, SC_CP_ARMOR, SC_CP_SHIELD, SC_CP_HELM}; const enum sc_type scdef[4] = {SC_CP_WEAPON, SC_CP_ARMOR, SC_CP_SHIELD, SC_CP_HELM};
struct status_change *sc = status_get_sc(bl); struct status_change *sc = status_get_sc(bl);
int i,j; int i;
TBL_PC *sd; TBL_PC *sd;
sd = BL_CAST(BL_PC, bl); sd = BL_CAST(BL_PC, bl);
if (sc && !sc->count) if (sc && !sc->count)
@ -2143,7 +2143,7 @@ int skill_break_equip (struct block_list *src,struct block_list *bl, unsigned sh
return 0; return 0;
if (sd) { if (sd) {
for (i = 0; i < EQI_MAX; i++) { for (i = 0; i < EQI_MAX; i++) {
j = sd->equip_index[i]; int j = sd->equip_index[i];
if (j < 0 || sd->status.inventory[j].attribute == 1 || !sd->inventory_data[j]) if (j < 0 || sd->status.inventory[j].attribute == 1 || !sd->inventory_data[j])
continue; continue;
@ -4094,7 +4094,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
// skill_area_temp[0] holds number of targets in area // skill_area_temp[0] holds number of targets in area
// skill_area_temp[1] holds the id of the original target // skill_area_temp[1] holds the id of the original target
// skill_area_temp[2] counts how many targets have already been processed // skill_area_temp[2] counts how many targets have already been processed
int sflag = skill_area_temp[0] & 0xFFF, heal; int sflag = skill_area_temp[0] & 0xFFF;
if( flag&SD_LEVEL ) if( flag&SD_LEVEL )
sflag |= SD_LEVEL; // -1 will be used in packets instead of the skill level sflag |= SD_LEVEL; // -1 will be used in packets instead of the skill level
if( skill_area_temp[1] != bl->id && !(skill_get_inf2(skill_id)&INF2_NPC_SKILL) ) if( skill_area_temp[1] != bl->id && !(skill_get_inf2(skill_id)&INF2_NPC_SKILL) )
@ -4114,7 +4114,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
sd->flicker = false; sd->flicker = false;
} }
else { else {
heal = (int)skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, sflag); int heal = (int)skill_attack(skill_get_type(skill_id), src, src, bl, skill_id, skill_lv, tick, sflag);
if( skill_id == NPC_VAMPIRE_GIFT && heal > 0 ) { if( skill_id == NPC_VAMPIRE_GIFT && heal > 0 ) {
clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1); clif_skill_nodamage(NULL, src, AL_HEAL, heal, 1);
status_heal(src,heal,0,0); status_heal(src,heal,0,0);
@ -4663,7 +4663,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
break; break;
i = spell[s==1?0:rand()%s];// Random select of spell to be released. i = spell[s==1?0:rand()%s];// Random select of spell to be released.
if( s && sc->data[i] ){// Now extract the data from the preserved spell if(sc->data[i] ){// Now extract the data from the preserved spell
skill_id = sc->data[i]->val1; skill_id = sc->data[i]->val1;
skill_lv = sc->data[i]->val2; skill_lv = sc->data[i]->val2;
point = sc->data[i]->val3; point = sc->data[i]->val3;
@ -4702,7 +4702,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
} }
else else
{ // Summon Balls { // Summon Balls
int j = 0, k, skele; int j = 0, k;
int spheres[5] = { 0, 0, 0, 0, 0 }, int spheres[5] = { 0, 0, 0, 0, 0 },
positions[5] = {-1,-1,-1,-1,-1 }; positions[5] = {-1,-1,-1,-1,-1 };
@ -4733,7 +4733,7 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl, uint
if( skill_lv == 1 ) j = 1; // Limit only to one ball if( skill_lv == 1 ) j = 1; // Limit only to one ball
for( i = 0; i < j; i++ ) for( i = 0; i < j; i++ )
{ {
skele = WL_RELEASE - 5 + sc->data[spheres[i]]->val1 - WLS_FIRE; // Convert Ball Element into Skill ATK for balls int skele = WL_RELEASE - 5 + sc->data[spheres[i]]->val1 - WLS_FIRE; // Convert Ball Element into Skill ATK for balls
// WL_SUMMON_ATK_FIRE, WL_SUMMON_ATK_WIND, WL_SUMMON_ATK_WATER, WL_SUMMON_ATK_GROUND // WL_SUMMON_ATK_FIRE, WL_SUMMON_ATK_WIND, WL_SUMMON_ATK_WATER, WL_SUMMON_ATK_GROUND
skill_addtimerskill(src,tick+status_get_adelay(src)*i,bl->id,0,0,skele,sc->data[spheres[i]]->val3,BF_MAGIC,flag|SD_LEVEL); skill_addtimerskill(src,tick+status_get_adelay(src)*i,bl->id,0,0,skele,sc->data[spheres[i]]->val3,BF_MAGIC,flag|SD_LEVEL);
status_change_end(src, spheres[i], INVALID_TIMER); // Eliminate ball status_change_end(src, spheres[i], INVALID_TIMER); // Eliminate ball
@ -7552,7 +7552,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case CG_TAROTCARD: case CG_TAROTCARD:
{ {
int eff, count = -1; int count = -1;
if( rnd() % 100 > skill_lv * 8 || (tsc && tsc->data[SC_BASILICA]) || if( rnd() % 100 > skill_lv * 8 || (tsc && tsc->data[SC_BASILICA]) ||
(dstmd && ((dstmd->guardian_data && dstmd->mob_id == MOBID_EMPERIUM) || mob_is_battleground(dstmd))) ) { (dstmd && ((dstmd->guardian_data && dstmd->mob_id == MOBID_EMPERIUM) || mob_is_battleground(dstmd))) ) {
if( sd ) if( sd )
@ -7563,7 +7563,7 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
} }
status_zap(src,0,skill_get_sp(skill_id,skill_lv)); // consume sp only if succeeded [Inkfish] status_zap(src,0,skill_get_sp(skill_id,skill_lv)); // consume sp only if succeeded [Inkfish]
do { do {
eff = rnd() % 14; int eff = rnd() % 14;
clif_specialeffect(bl, 523 + eff, AREA); clif_specialeffect(bl, 523 + eff, AREA);
switch (eff) switch (eff)
{ {
@ -9653,11 +9653,11 @@ int skill_castend_nodamage_id (struct block_list *src, struct block_list *bl, ui
case MH_SILENT_BREEZE: { case MH_SILENT_BREEZE: {
struct status_change *ssc = status_get_sc(src); struct status_change *ssc = status_get_sc(src);
struct block_list *m_bl = battle_get_master(src); struct block_list *m_bl = battle_get_master(src);
const enum sc_type scs[] = {
SC_MANDRAGORA, SC_HARMONIZE, SC_DEEPSLEEP, SC_VOICEOFSIREN, SC_SLEEP, SC_CONFUSION, SC_HALLUCINATION
};
int heal; int heal;
if(tsc){ if(tsc){
const enum sc_type scs[] = {
SC_MANDRAGORA, SC_HARMONIZE, SC_DEEPSLEEP, SC_VOICEOFSIREN, SC_SLEEP, SC_CONFUSION, SC_HALLUCINATION
};
for (i = 0; i < ARRAYLENGTH(scs); i++) { for (i = 0; i < ARRAYLENGTH(scs); i++) {
if (tsc->data[scs[i]]) status_change_end(bl, scs[i], INVALID_TIMER); if (tsc->data[scs[i]]) status_change_end(bl, scs[i], INVALID_TIMER);
} }
@ -10205,7 +10205,6 @@ int skill_castend_id(int tid, unsigned int tick, int id, intptr_t data)
int skill_castend_pos(int tid, unsigned int tick, int id, intptr_t data) int skill_castend_pos(int tid, unsigned int tick, int id, intptr_t data)
{ {
struct block_list* src = map_id2bl(id); struct block_list* src = map_id2bl(id);
int maxcount;
struct map_session_data *sd; struct map_session_data *sd;
struct unit_data *ud = unit_bl2ud(src); struct unit_data *ud = unit_bl2ud(src);
struct mob_data *md; struct mob_data *md;
@ -10235,6 +10234,7 @@ int skill_castend_pos(int tid, unsigned int tick, int id, intptr_t data)
ud->skilltimer = INVALID_TIMER; ud->skilltimer = INVALID_TIMER;
do { do {
int maxcount=0;
if( status_isdead(src) ) if( status_isdead(src) )
break; break;

View File

@ -1769,12 +1769,12 @@ int unit_skilluse_pos2( struct block_list *src, short skill_x, short skill_y, ui
*/ */
int unit_set_target(struct unit_data* ud, int target_id) int unit_set_target(struct unit_data* ud, int target_id)
{ {
struct unit_data * ux;
struct block_list* target;
nullpo_ret(ud); nullpo_ret(ud);
if( ud->target != target_id ) { if( ud->target != target_id ) {
struct unit_data * ux;
struct block_list* target;
if( ud->target && (target = map_id2bl(ud->target)) && (ux = unit_bl2ud(target)) && ux->target_count > 0 ) if( ud->target && (target = map_id2bl(ud->target)) && (ux = unit_bl2ud(target)) && ux->target_count > 0 )
ux->target_count --; ux->target_count --;
if( target_id && (target = map_id2bl(target_id)) && (ux = unit_bl2ud(target)) ) if( target_id && (target = map_id2bl(target_id)) && (ux = unit_bl2ud(target)) )
@ -1939,7 +1939,6 @@ bool unit_can_reach_pos(struct block_list *bl,int x,int y, int easy)
*/ */
bool unit_can_reach_bl(struct block_list *bl,struct block_list *tbl, int range, int easy, short *x, short *y) bool unit_can_reach_bl(struct block_list *bl,struct block_list *tbl, int range, int easy, short *x, short *y)
{ {
int i;
short dx,dy; short dx,dy;
nullpo_retr(false, bl); nullpo_retr(false, bl);
nullpo_retr(false, tbl); nullpo_retr(false, tbl);
@ -1960,6 +1959,7 @@ bool unit_can_reach_bl(struct block_list *bl,struct block_list *tbl, int range,
dy=(dy>0)?1:((dy<0)?-1:0); dy=(dy>0)?1:((dy<0)?-1:0);
if (map_getcell(tbl->m,tbl->x-dx,tbl->y-dy,CELL_CHKNOPASS)) { // Look for a suitable cell to place in. if (map_getcell(tbl->m,tbl->x-dx,tbl->y-dy,CELL_CHKNOPASS)) { // Look for a suitable cell to place in.
int i;
for(i=0;i<9 && map_getcell(tbl->m,tbl->x-dirx[i],tbl->y-diry[i],CELL_CHKNOPASS);i++); for(i=0;i<9 && map_getcell(tbl->m,tbl->x-dirx[i],tbl->y-diry[i],CELL_CHKNOPASS);i++);
if (i==9) return false; // No valid cells. if (i==9) return false; // No valid cells.
dx = dirx[i]; dx = dirx[i];
@ -1981,7 +1981,7 @@ bool unit_can_reach_bl(struct block_list *bl,struct block_list *tbl, int range,
*/ */
int unit_calc_pos(struct block_list *bl, int tx, int ty, uint8 dir) int unit_calc_pos(struct block_list *bl, int tx, int ty, uint8 dir)
{ {
int dx, dy, x, y, i, k; int dx, dy, x, y;
struct unit_data *ud = unit_bl2ud(bl); struct unit_data *ud = unit_bl2ud(bl);
nullpo_ret(ud); nullpo_ret(ud);
@ -2001,8 +2001,9 @@ int unit_calc_pos(struct block_list *bl, int tx, int ty, uint8 dir)
if( dx > 0 ) x--; else if( dx < 0 ) x++; if( dx > 0 ) x--; else if( dx < 0 ) x++;
if( dy > 0 ) y--; else if( dy < 0 ) y++; if( dy > 0 ) y--; else if( dy < 0 ) y++;
if( !unit_can_reach_pos(bl, x, y, 0) ) { if( !unit_can_reach_pos(bl, x, y, 0) ) {
int i;
for( i = 0; i < 12; i++ ) { for( i = 0; i < 12; i++ ) {
k = rnd()%8; // Pick a Random Dir int k = rnd()%8; // Pick a Random Dir
dx = -dirx[k] * 2; dx = -dirx[k] * 2;
dy = -diry[k] * 2; dy = -diry[k] * 2;
x = tx + dx; x = tx + dx;

View File

@ -293,7 +293,7 @@ void vending_openvending(struct map_session_data* sd, const char* message, const
sd->vending[i].index = index; sd->vending[i].index = index;
sd->vending[i].amount = amount; sd->vending[i].amount = amount;
sd->vending[i].value = cap_value(value, 0, (unsigned int)battle_config.vending_max_value); sd->vending[i].value = min(value, (unsigned int)battle_config.vending_max_value);
i++; // item successfully added i++; // item successfully added
} }

View File

@ -13,7 +13,7 @@
# --i=../db/re/mob_skill_db.txt --o=../sql-files/mob_skill_db_re.sql --t=re --m=mob_skill --table=mob_skill_db_re # --i=../db/re/mob_skill_db.txt --o=../sql-files/mob_skill_db_re.sql --t=re --m=mob_skill --table=mob_skill_db_re
# #
# List of options: # List of options:
# item_db.pl --help # convert_sql.pl --help
use strict; use strict;
use warnings; use warnings;