* Changes to Dissonance -- don't increment the timer again if the target has died

* Changed some nullpo checks back to normal null checks
* Changed some nullpo checks to print some debug information
* Added some sd checks before calling pc_blockskill
* Added fix for SQL char's friend list updating
* Fixed a crash if the player invited to join a guild is not online
* Find the guild invitation sender first before clearing it

git-svn-id: https://svn.code.sf.net/p/rathena/svn/branches/stable@1124 54d463be-8e91-2dee-dedb-b68131a5f0ec
This commit is contained in:
celest 2005-02-17 08:31:32 +00:00
parent c54e7367f7
commit 3a2e00b268
6 changed files with 69 additions and 31 deletions

View File

@ -1,6 +1,17 @@
Date Added Date Added
02/17 02/17
* Added Shinomori's changes to Dissonance -- don't increment the timer again
if the target has died [celest]
* Changed some nullpo checks back to normal null checks -- in some situations
it would be normal to get a NULL [celest]
* Changed some nullpo checks to print some debug information [celest]
* Added some sd checks before calling pc_blockskill [celest]
* Added Dino9021's fix for SQL char's friend list updating [celest]
* Fixed a crash if the player invited to join a guild is not online, thanks to
Alex14 [celest]
* Find the guild invitation sender first before clearing its ID [celest]
* Added 2 new script commands to support 2/15's cards patch... most of the * Added 2 new script commands to support 2/15's cards patch... most of the
effects in kRO should be available now ^^ [celest] effects in kRO should be available now ^^ [celest]

View File

@ -622,24 +622,41 @@ int mmo_char_tosql(int char_id, struct mmo_charstatus *p){
// Friends list // Friends list
// account_id, friend_id0, name0, ... // account_id, friend_id0, name0, ...
#if 0
tmp_p += sprintf(tmp_p, "REPLACE INTO `%s` (`id`, `account_id`",friend_db);
tmp_p += sprintf(tmp_p, "REPLACE INTO `%s` (`id`, `account_id`",friend_db); diff = 0;
diff = 0; for (i=0;i<20;i++)
tmp_p += sprintf(tmp_p, ", `friend_id%d`, `name%d`", i, i);
for (i=0;i<20;i++) tmp_p += sprintf(tmp_p, ") VALUES (NULL, '%d'", char_id);
tmp_p += sprintf(tmp_p, ", `friend_id%d`, `name%d`", i, i);
tmp_p += sprintf(tmp_p, ") VALUES (NULL, '%d'", char_id); for (i=0;i<20;i++) {
tmp_p += sprintf(tmp_p, ", '%d', '%s'", p->friend_id[i], p->friend_name[i]);
if ((p->friend_id[i] != cp->friend_id[i]) ||
strcmp(p->friend_name[i], cp->friend_name[i]))
diff = 1;
}
for (i=0;i<20;i++) { tmp_p += sprintf(tmp_p, ")");
tmp_p += sprintf(tmp_p, ", '%d', '%s'", p->friend_id[i], p->friend_name[i]); #else // [Dino9021]
if ((p->friend_id[i] != cp->friend_id[i]) || tmp_p += sprintf(tmp_p, "UPDATE `%s` SET ",friend_db);
strcmp(p->friend_name[i], cp->friend_name[i]))
diff = 1;
}
tmp_p += sprintf(tmp_p, ")"); diff = 0;
for (i=0;i<20;i++) {
if (i>0)
tmp_p += sprintf(tmp_p, ", ");
tmp_p += sprintf(tmp_p, "`friend_id%d`='%d', `name%d`='%s'", i, p->friend_id[i], i, p->friend_name[i]);
if ((p->friend_id[i] != cp->friend_id[i]) || strcmp(p->friend_name[i], cp->friend_name[i]))
diff = 1;
}
tmp_p += sprintf(tmp_p, " where account_id='%d';", char_id);
#endif
if (diff) if (diff)
mysql_query(&mysql_handle, tmp_sql); mysql_query(&mysql_handle, tmp_sql);

View File

@ -581,17 +581,18 @@ int guild_member_added(int guild_id,int account_id,int char_id,int flag)
if( (g=guild_search(guild_id))==NULL ) if( (g=guild_search(guild_id))==NULL )
return 0; return 0;
if((sd==NULL || sd->guild_invite==0) && flag==0){ if(sd==NULL || sd->guild_invite==0){
// キャラ側に登録できなかったため脱退要求を出す // キャラ側に登録できなかったため脱退要求を出す
if(battle_config.error_log) if (flag == 0) {
printf("guild: member added error %d is not online\n",account_id); if(battle_config.error_log)
intif_guild_leave(guild_id,account_id,char_id,0,"**“o˜¸”s**"); printf("guild: member added error %d is not online\n",account_id);
intif_guild_leave(guild_id,account_id,char_id,0,"**“o˜¸”s**");
}
return 0; return 0;
} }
sd->guild_invite=0; sd2 = map_id2sd(sd->guild_invite_account);
sd->guild_invite_account=0; sd->guild_invite = 0;
sd->guild_invite_account = 0;
sd2=map_id2sd(sd->guild_invite_account);
if(flag==1){ // 失敗 if(flag==1){ // 失敗
if( sd2!=NULL ) if( sd2!=NULL )

View File

@ -3114,7 +3114,7 @@ static int pc_walk(int tid,unsigned int tick,int id,int data)
int moveblock; int moveblock;
int x,y,dx,dy; int x,y,dx,dy;
nullpo_retr(0, (sd=map_id2sd(id))); nullpo_retr_f(0, (sd=map_id2sd(id)), "id=%d", id);
if(sd->walktimer != tid){ if(sd->walktimer != tid){
if(battle_config.error_log) if(battle_config.error_log)

View File

@ -2823,7 +2823,8 @@ int skill_castend_damage_id( struct block_list* src, struct block_list *bl,int s
clif_updatestatus(sd,SP_SP); clif_updatestatus(sd,SP_SP);
} }
} }
pc_blockskill_start (sd, skillid, (skilllv < 5 ? 10000: 15000)); if (sd)
pc_blockskill_start (sd, skillid, (skilllv < 5 ? 10000: 15000));
} }
break; break;
@ -3305,7 +3306,8 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case SM_ENDURE: /* インデュア */ case SM_ENDURE: /* インデュア */
clif_skill_nodamage(src,bl,skillid,skilllv,1); clif_skill_nodamage(src,bl,skillid,skilllv,1);
status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 ); status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
pc_blockskill_start (sd, skillid, 10000); if (sd)
pc_blockskill_start (sd, skillid, 10000);
break; break;
case SM_AUTOBERSERK: // Celest case SM_AUTOBERSERK: // Celest
@ -5039,7 +5041,8 @@ int skill_castend_pos2( struct block_list *src, int x,int y,int skillid,int skil
pc_movepos(sd,x,y); pc_movepos(sd,x,y);
}else if( src->type==BL_MOB ) }else if( src->type==BL_MOB )
mob_warp((struct mob_data *)src,-1,x,y,0); mob_warp((struct mob_data *)src,-1,x,y,0);
pc_blockskill_start (sd, MO_EXTREMITYFIST, 2000); if (sd)
pc_blockskill_start (sd, MO_EXTREMITYFIST, 2000);
break; break;
case AM_CANNIBALIZE: // バイオプラント case AM_CANNIBALIZE: // バイオプラント
if(sd){ if(sd){
@ -7718,10 +7721,12 @@ int skill_use_id( struct map_session_data *sd, int target_id,
case WE_FEMALE: case WE_FEMALE:
{ {
struct map_session_data *p_sd = pc_get_partner(sd); struct map_session_data *p_sd = pc_get_partner(sd);
nullpo_retr (0, p_sd) if (p_sd == NULL) // it's possible to get null if we're not married ^^;
return 0;
// nullpo_retr (0, p_sd)
if(skill_num == WE_MALE && sd->status.hp <= ((15*sd->status.max_hp)/100)) // Requires more than 15% of Max HP for WE_MALE if(skill_num == WE_MALE && sd->status.hp <= ((15*sd->status.max_hp)/100)) // Requires more than 15% of Max HP for WE_MALE
return 0; return 0;
if(skill_num == WE_FEMALE && sd->status.sp <= ((15*sd->status.max_sp)/100)) // Requires more than 15% of Max SP for WE_FEMALE else if(skill_num == WE_FEMALE && sd->status.sp <= ((15*sd->status.max_sp)/100)) // Requires more than 15% of Max SP for WE_FEMALE
return 0; return 0;
target_id = p_sd->bl.id; target_id = p_sd->bl.id;
//rangeをもう1回?査 //rangeをもう1回?査

View File

@ -3997,13 +3997,13 @@ int status_change_end( struct block_list* bl , int type,int tid )
*/ */
int status_change_timer(int tid, unsigned int tick, int id, int data) int status_change_timer(int tid, unsigned int tick, int id, int data)
{ {
int type=data; int type = data;
struct block_list *bl; struct block_list *bl;
struct map_session_data *sd=NULL; struct map_session_data *sd=NULL;
struct status_change *sc_data; struct status_change *sc_data;
//short *sc_count; //使ってない? //short *sc_count; //使ってない?
nullpo_retr(0, bl=map_id2bl(id)); nullpo_retr_f(0, bl=map_id2bl(id), "id=%d data=%d",id,data);
nullpo_retr(0, sc_data=status_get_sc_data(bl)); nullpo_retr(0, sc_data=status_get_sc_data(bl));
if(bl->type==BL_PC) if(bl->type==BL_PC)
@ -4104,8 +4104,10 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
case SC_WATERBALL: /* ウォ?タ?ボ?ル */ case SC_WATERBALL: /* ウォ?タ?ボ?ル */
{ {
struct block_list *target=map_id2bl(sc_data[type].val2); struct block_list *target=map_id2bl(sc_data[type].val2);
nullpo_retb(target); if (!target || !target->prev)
nullpo_retb(target->prev); break; // target has been killed in previous hits, no need to raise an alarm ^^;
// nullpo_retb(target);
// nullpo_retb(target->prev);
skill_attack(BF_MAGIC,bl,bl,target,WZ_WATERBALL,sc_data[type].val1,tick,0); skill_attack(BF_MAGIC,bl,bl,target,WZ_WATERBALL,sc_data[type].val1,tick,0);
if((--sc_data[type].val3)>0) { if((--sc_data[type].val3)>0) {
sc_data[type].timer=add_timer( 150+tick,status_change_timer, bl->id, data ); sc_data[type].timer=add_timer( 150+tick,status_change_timer, bl->id, data );
@ -4139,8 +4141,10 @@ int status_change_timer(int tid, unsigned int tick, int id, int data)
break;*/ break;*/
nullpo_retb(unit); nullpo_retb(unit);
nullpo_retb(unit->group); nullpo_retb(unit->group);
nullpo_retr(0, src=map_id2bl(unit->group->src_id)); nullpo_retb(src=map_id2bl(unit->group->src_id));
skill_attack(BF_MISC,src,&unit->bl,bl,unit->group->skill_id,sc_data[type].val1,tick,0); skill_attack(BF_MISC,src,&unit->bl,bl,unit->group->skill_id,sc_data[type].val1,tick,0);
if( (bl->type==BL_MOB) && (MS_DEAD==((struct mob_data *)bl)->state.state) )
break;
sc_data[type].timer=add_timer(skill_get_time2(unit->group->skill_id,unit->group->skill_lv)+tick, sc_data[type].timer=add_timer(skill_get_time2(unit->group->skill_id,unit->group->skill_lv)+tick,
status_change_timer, bl->id, data ); status_change_timer, bl->id, data );
return 0; return 0;