summaryrefslogtreecommitdiff
path: root/src/map/pc.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/map/pc.c')
-rw-r--r--src/map/pc.c157
1 files changed, 96 insertions, 61 deletions
diff --git a/src/map/pc.c b/src/map/pc.c
index 3dcb08f3b..b9185c8b8 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -714,8 +714,7 @@ int pc_authok(int id, int login_id2, time_t connect_until_time, struct mmo_chars
sd->skilltimerskill[i].timer = -1;
sd->timerskill_count=0;
- for (i=0; i<MAX_SKILL; i++)
- sd->blockskill[i]=0;
+ memset(sd->blockskill,0,sizeof(sd->blockskill));
memset(&sd->dev,0,sizeof(struct square));
for(i = 0; i < 5; i++) {
@@ -2037,25 +2036,24 @@ int pc_skill(struct map_session_data *sd,int id,int level,int flag)
*/
int pc_blockskill_end(int tid,unsigned int tick,int id,int data)
{
- struct map_session_data *sd;
-
- nullpo_retr (-1, sd = map_id2sd(id));
- sd->blockskill[data] = 0;
+ struct map_session_data *sd = map_id2sd(id);
+ if (data <= 0 || data >= MAX_SKILL)
+ return 0;
+ if (sd) sd->blockskill[data] = 0;
return 1;
}
-void pc_blockskill_start (struct map_session_data *sd, int skillid, int tick)
+int pc_blockskill_start (struct map_session_data *sd, int skillid, int tick)
{
- nullpo_retv(sd);
+ nullpo_retr (-1, sd);
if (skillid >= 10000 && skillid < 10015)
skillid -= 9500;
else if (skillid < 1 || skillid > MAX_SKILL)
- return;
+ return -1;
sd->blockskill[skillid] = 1;
- add_timer(gettick()+tick,pc_blockskill_end,sd->bl.id,skillid);
- return;
+ return add_timer(gettick()+tick,pc_blockskill_end,sd->bl.id,skillid);
}
/*==========================================
@@ -2460,6 +2458,7 @@ int pc_useitem(struct map_session_data *sd,int n)
nullpo_retr(1, sd);
if(n >=0 && n < MAX_INVENTORY) {
+ char *script;
sd->itemid = sd->status.inventory[n].nameid;
amount = sd->status.inventory[n].amount;
if(sd->status.inventory[n].nameid <= 0 ||
@@ -2474,12 +2473,10 @@ int pc_useitem(struct map_session_data *sd,int n)
clif_useitemack(sd,n,0,0);
return 1;
}
-
- if(sd->inventory_data[n])
- run_script(sd->inventory_data[n]->use_script,0,sd->bl.id,0);
-
+ script = sd->inventory_data[n]->use_script;
amount = sd->status.inventory[n].amount;
clif_useitemack(sd,n,amount-1,1);
+ run_script(script,0,sd->bl.id,0);
pc_delitem(sd,n,1,1);
}
@@ -2878,40 +2875,53 @@ int pc_steal_coin(struct map_session_data *sd,struct block_list *bl)
//
//
/*==========================================
- * PCの位置設定
+ * PCをマップから離脱する
*------------------------------------------
*/
-int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrtype)
-{
- char mapname[24];
- int m=0,disguise=0;
+int pc_remove_map(struct map_session_data *sd,int clrtype) {
nullpo_retr(0, sd);
- if(sd->chatID) // チャットから出る
+ // map 上に登録されていない
+ if(!sd->bl.prev)
+ return 1;
+
+ // チャットから出る
+ if(sd->chatID)
chat_leavechat(sd);
- if(sd->trade_partner) // 取引を中?する
+
+ // 取引を中断する
+ if(sd->trade_partner)
trade_tradecancel(sd);
+
+ // 倉庫を開いてるなら保存する
if(sd->state.storage_flag)
storage_guild_storage_quit(sd,0);
else
- storage_storage_quit(sd); // 倉庫を開いてるなら保存する
+ storage_storage_quit(sd);
- if(sd->party_invite>0) // パ?ティ?誘を拒否する
+ // パーティ勧誘を拒否する
+ if(sd->party_invite>0)
party_reply_invite(sd,sd->party_invite_account,0);
- if(sd->guild_invite>0) // ギルド?誘を拒否する
+
+ // ギルド勧誘を拒否する
+ if(sd->guild_invite>0)
guild_reply_invite(sd,sd->guild_invite,0);
- if(sd->guild_alliance>0) // ギルド同盟?誘を拒否する
+
+ // ギルド同盟勧誘を拒否する
+ if(sd->guild_alliance>0)
guild_reply_reqalliance(sd,sd->guild_alliance_account,0);
- skill_castcancel(&sd->bl,0); // 詠唱中?
- pc_stop_walking(sd,0); // ?行中?
- pc_stopattack(sd); // 攻?中?
+ // check if we've been authenticated [celest]
+ //if (sd->state.auth) {
+ pc_stop_walking(sd,0); // 歩行中断
+ pc_stopattack(sd); // 攻撃中断
+ pc_delinvincibletimer(sd); // 無敵タイマー削除
+ //}
- if(pc_issit(sd)) {
- pc_setstand(sd);
- skill_gangsterparadise(sd,0);
- }
+ // ブレードストップを終わらせる
+ if(sd->sc_data[SC_BLADESTOP].timer!=-1)
+ status_change_end(&sd->bl,SC_BLADESTOP,-1);
if (sd->sc_count) {
if(sd->sc_data[SC_TRICKDEAD].timer != -1)
@@ -2933,6 +2943,35 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
}
}
+ // check if we've been authenticated [celest]
+ //if (sd->state.auth)
+ skill_castcancel(&sd->bl,0); // 詠唱中断
+ skill_gangsterparadise(sd,0); // ギャングスターパラダイス削除
+ skill_unit_move(&sd->bl,gettick(),0); // スキルユニットから離脱
+ skill_cleartimerskill(&sd->bl); // タイマースキルクリア
+ skill_clear_unitgroup(&sd->bl); // スキルユニットグループの削除
+
+ clif_clearchar_area(&sd->bl,clrtype&0xffff);
+ map_delblock(&sd->bl);
+ return 0;
+}
+
+/*==========================================
+ * PCの位置設定
+ *------------------------------------------
+ */
+int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrtype)
+{
+ char mapname[24];
+ int m=0,disguise=0;
+
+ nullpo_retr(0, sd);
+
+ if(pc_issit(sd)) {
+ pc_setstand(sd);
+ skill_gangsterparadise(sd,0);
+ }
+
if(sd->status.option&2)
status_change_end(&sd->bl, SC_HIDING, -1);
if(sd->status.option&4)
@@ -2940,11 +2979,6 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
if(sd->status.option&16384)
status_change_end(&sd->bl, SC_CHASEWALK, -1);
- if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 0) {
- pet_stopattack(sd->pd);
- pet_changestate(sd->pd,MS_IDLE,0);
- }
-
if(sd->disguise) { // clear disguises when warping [Valaris]
clif_clearchar(&sd->bl, 9);
disguise=sd->disguise;
@@ -2960,14 +2994,9 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
m=map_mapname2mapid(mapname);
if(m<0){
- if(sd->mapname[0]){
+ //if(sd->mapname[0]){
int ip,port;
if(map_mapname2ipport(mapname,&ip,&port)==0){
- skill_stop_dancing(&sd->bl,1);
- skill_unit_move(&sd->bl,gettick(),0);
- clif_clearchar_area(&sd->bl,clrtype&0xffff);
- skill_gangsterparadise(sd,0);
- map_delblock(&sd->bl);
if(sd->status.pet_id > 0 && sd->pd) {
if(sd->pd->bl.m != m && sd->pet.intimate <= 0) {
pet_remove_map(sd);
@@ -2985,6 +3014,15 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
map_delblock(&sd->pd->bl);
}
}
+
+ party_send_logout(sd); // パーティのログアウトメッセージ送信
+ guild_send_memberinfoshort(sd,0); // ギルドのログアウトメッセージ送信
+ status_change_clear(&sd->bl,1); // ステータス異常を解除する
+ skill_stop_dancing(&sd->bl,1); // ダンス/演奏中断
+ pc_cleareventtimer(sd); // イベントタイマを破棄する
+ pc_delspiritball(sd,sd->spiritball,1); // 気功削除
+ pc_remove_map(sd,clrtype);
+
memcpy(sd->mapname,mapname,24);
sd->bl.x=x;
sd->bl.y=y;
@@ -2998,7 +3036,7 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
chrif_changemapserver(sd, mapname, x, y, ip, port);
return 0;
}
- }
+ //}
#if 0
clif_authfail_fd(sd->fd,0); // cancel
clif_setwaitclose(sd->fd);
@@ -3019,12 +3057,17 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
} while(map_getcell(m,x,y,CELL_CHKNOPASS));
}
- if(sd->mapname[0] && sd->bl.prev != NULL){
- skill_unit_move(&sd->bl,gettick(),0);
- clif_clearchar_area(&sd->bl,clrtype&0xffff);
- skill_gangsterparadise(sd,0);
- map_delblock(&sd->bl);
- // pet
+ if(m == sd->bl.m) {
+ // 同じマップなのでダンスユニット引き継ぎ
+ sd->to_x = x;
+ sd->to_y = y;
+ skill_stop_dancing(&sd->bl, 2); //移動先にユニットを移動するかどうかの判断もする
+ } else {
+ // 違うマップなのでダンスユニット削除
+ skill_stop_dancing(&sd->bl, 1);
+ }
+ if(sd->bl.prev != NULL){
+ pc_remove_map(sd,clrtype);
if(sd->status.pet_id > 0 && sd->pd) {
if(sd->pd->bl.m != m && sd->pet.intimate <= 0) {
pet_remove_map(sd);
@@ -3034,9 +3077,6 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
sd->petDB = NULL;
if(battle_config.pet_status_support)
status_calc_pc(sd,2);
- pc_makesavestatus(sd);
- chrif_save(sd);
- storage_storage_save(sd);
}
else if(sd->pet.intimate > 0) {
pet_stopattack(sd->pd);
@@ -3053,13 +3093,8 @@ int pc_setpos(struct map_session_data *sd,char *mapname_org,int x,int y,int clrt
memcpy(sd->mapname,mapname,24);
sd->bl.m = m;
- sd->to_x = x;
- sd->to_y = y;
-
- // moved and changed dance effect stopping
-
- sd->bl.x = x;
- sd->bl.y = y;
+ sd->bl.x = x;
+ sd->bl.y = y;
if(sd->status.pet_id > 0 && sd->pd && sd->pet.intimate > 0) {
sd->pd->bl.m = m;