Pārlūkot izejas kodu

- Player-summoned mobs won't level up now.
- Fixed Super Novice explosion spirits triggering no matter what you said on the third line. It now triggers on the fourth line....
- Fixed GTB blocking targetted spells when gtb_pvp_only was set.
- Merged the code of Ankle snare and Spider web. It no longer moves target if sc failed.
- Players should stop walking as soon as they start vending or get into a chat.


git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@5382 54d463be-8e91-2dee-dedb-b68131a5f0ec

skotlex 19 gadi atpakaļ
vecāks
revīzija
260f904cea
7 mainītis faili ar 31 papildinājumiem un 32 dzēšanām
  1. 8 0
      Changelog-Trunk.txt
  2. 2 1
      src/map/chat.c
  3. 1 0
      src/map/clif.c
  4. 1 1
      src/map/pc.c
  5. 11 30
      src/map/skill.c
  6. 7 0
      src/map/status.c
  7. 1 0
      src/map/vending.c

+ 8 - 0
Changelog-Trunk.txt

@@ -5,6 +5,14 @@ IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.  EV
 GOES INTO TRUNK AND WILL BE MERGED INTO STABLE BY VALARIS AND WIZPUTER. -- VALARIS
 
 2006/02/23
+	* Player-summoned mobs won't level up now. [Skotlex]
+	* Fixed Super Novice explosion spirits triggering no matter what you said
+	  on the third line. It now triggers on the fourth line.... [Skotlex]
+	* Fixed GTB blocking targetted spells when gtb_pvp_only was set. [Skotlex]
+	* Merged the code of Ankle snare and Spider web. It no longer moves target
+	  if sc failed. [Skotlex]
+	* Players should stop walking as soon as they start vending or get into a
+	  chat. [Skotlex]
 	* Added mob skill conditions myhpinrate and friendhpinrate. [Skotlex]
 	* Added monster_ai condition 16 (enable `friend` targetted skills to heal
 	  oneself) [Skotlex]

+ 2 - 1
src/map/chat.c

@@ -27,7 +27,7 @@ int chat_createchat(struct map_session_data *sd,int limit,int pub,char* pass,cha
 
 	if (sd->chatID)
 		return 0;	//Prevent people abusing the chat system by creating multiple chats, as pointed out by End of Exam. [Skotlex]
-	
+	pc_stop_walking(sd,1);
 	cd = (struct chat_data *) aCalloc(1,sizeof(struct chat_data));
 
 	cd->limit = limit;
@@ -87,6 +87,7 @@ int chat_joinchat (struct map_session_data *sd, int chatid, char* pass)
 		return 0;
 	}
 
+	pc_stop_walking(sd,1);
 	cd->usersd[cd->users] = sd;
 	cd->users++;
 

+ 1 - 0
src/map/clif.c

@@ -9155,6 +9155,7 @@ void clif_parse_GlobalMessage(int fd, struct map_session_data *sd) { // S 008c <
 			case 2:
 				if (strstr(message, msg_txt(506)))
 					sd->state.snovice_flag++;
+				break;
 			case 3:
 				if (skillnotok(MO_EXPLOSIONSPIRITS,sd))
 					break; //Do not override the noskill mapflag. [Skotlex]

+ 1 - 1
src/map/pc.c

@@ -5510,7 +5510,7 @@ int pc_damage(struct block_list *src,struct map_session_data *sd,int damage)
 		}
 		if(battle_config.mobs_level_up && md && md->state.state!=MS_DEAD &&
 			md->level < pc_maxbaselv(sd) &&
-			!md->guardian_data // Guardians should not level. [Skotlex]
+			!md->guardian_data && !md->special_state.ai// Guardians/summons should not level. [Skotlex]
 		) { 	// monster level up [Valaris]
 			clif_misceffect(&md->bl,0);
 			md->level++;

+ 11 - 30
src/map/skill.c

@@ -1141,16 +1141,6 @@ int skill_additional_effect (struct block_list* src, struct block_list *bl, int
 			skilllv,0,0,0,skill_get_time2(skillid,skilllv),0);
 		break;
 
-	case PF_SPIDERWEB:		/* スパイダ?ウェッブ */
-		{
-			int sec = skill_get_time2(skillid,skilllv);
-			if(map[src->m].flag.pvp) //PvPでは?S束時間半減?H
-				sec = sec/2;
-			battle_stopwalking(bl,1);
-			status_change_start(bl,SkillStatusChangeTable[skillid],100,skilllv,0,0,0,sec,0);
-		}
-		break;
-
 	case ASC_METEORASSAULT:			/* �?テオアサルト */
 		//Any enemies hit by this skill will receive Stun, Darkness, or external bleeding status ailment with a 5%+5*SkillLV% chance.
 		switch(rand()%3) {
@@ -2492,7 +2482,8 @@ int skill_castend_damage_id (struct block_list* src, struct block_list *bl,int s
 	if (status_isdead(src) || (src != bl && status_isdead(bl)))
 		return 1;
 
-	if (skillid && skill_get_type(skillid) == BF_MAGIC && status_isimmune(bl))
+	if (skillid && skill_get_type(skillid) == BF_MAGIC && 
+		!battle_config.gtb_pvp_only && status_isimmune(bl))
 		//GTB makes all targetted skills silently fail.
 		return 1;
 
@@ -6910,19 +6901,21 @@ int skill_unit_onplace_timer(struct skill_unit *src,struct block_list *bl,unsign
 		}
 		break;
 
+	case UNT_SPIDERWEB:
 	case UNT_ANKLESNARE:
-		if(sg->val2==0 && tsc && tsc->data[SC_ANKLE].timer==-1){
+		if(sg->val2==0 && (!tsc || tsc->data[type].timer==-1 )){
 		 	int sec = skill_get_time2(sg->skill_id,sg->skill_lv);
-			battle_stopwalking(bl,1);
-			status_change_start(bl,SC_ANKLE,100,sg->skill_lv,0,0,0,sec,0);
-			map_moveblock(bl, src->bl.x, src->bl.y, tick);
-			clif_fixpos(bl);
+			if (status_change_start(bl,type,100,sg->skill_lv,0,0,0,sec,0))
+			{
+				map_moveblock(bl, src->bl.x, src->bl.y, tick);
+ 				clif_fixpos(bl);
+				sg->val2=bl->id;
+			}
 			//clif_01ac(&src->bl); //Removed? Check the openkore description of this packet: [Skotlex]
 			// 01AC: long ID
 			// Indicates that an object is trapped, but ID is not a
 			// valid monster or player ID.
-			sg->limit=DIFF_TICK(tick,sg->tick)+sec;
-			sg->val2=bl->id;
+			sg->limit = DIFF_TICK(tick,sg->tick)+sec;
 			sg->interval = -1;
 			src->range = 0;
 		}
@@ -7092,18 +7085,6 @@ int skill_unit_onplace_timer(struct skill_unit *src,struct block_list *bl,unsign
 		}
 		break;
 
-	case UNT_SPIDERWEB:
-		if(sg->val2==0 && (!tsc || tsc->data[type].timer==-1 )){
-			skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MISC,tick);
-			map_moveblock(bl, src->bl.x, src->bl.y, tick);
- 			clif_fixpos(bl);
-			sg->limit = DIFF_TICK(tick,sg->tick)+skill_get_time2(sg->skill_id,sg->skill_lv);
-			sg->val2=bl->id;
-			sg->interval = -1;
-			src->range = 0;
-		}
-		break;
-
 	case UNT_GRAVITATION:
 		if (skill_attack(BF_MAGIC,ss,&src->bl,bl,sg->skill_id,sg->skill_lv,tick,0))
 			skill_additional_effect(ss,bl,sg->skill_id,sg->skill_lv,BF_MAGIC,tick);

+ 7 - 0
src/map/status.c

@@ -114,6 +114,7 @@ void initChangeTables(void) {
 	set_sc(BS_OVERTHRUST,           SC_OVERTHRUST,          SI_OVERTHRUST);
 	set_sc(BS_MAXIMIZE,             SC_MAXIMIZEPOWER,       SI_MAXIMIZEPOWER);
 	set_sc(HT_LANDMINE,             SC_STUN,                SI_BLANK);
+	set_sc(HT_ANKLESNARE,           SC_ANKLE,               SI_BLANK);
 	set_sc(HT_SANDMAN,              SC_SLEEP,               SI_BLANK);
 	set_sc(HT_FLASHER,              SC_BLIND,               SI_BLANK);
 	set_sc(HT_FREEZINGTRAP,         SC_FREEZE,              SI_BLANK);
@@ -3389,6 +3390,10 @@ int status_get_sc_tick(struct block_list *bl, int type, int tick)
 		// Changed to 3 secs and moved from skill.c [Skotlex]
 			min = 3000;
 		break;
+		case SC_SPIDERWEB:
+			if (map[bl->m].flag.pvp)
+				tick /=2;
+		break;
 		case SC_STOP:
 		// Unsure of this... but I get a feeling that agi reduces this
 		// (it was on Tiger Fist Code, but at -1 ms per 10 agi....
@@ -4409,6 +4414,8 @@ int status_change_start(struct block_list *bl,int type,int rate,int val1,int val
 		case SC_CONFUSION:
 		case SC_CLOSECONFINE:
 		case SC_CLOSECONFINE2:
+		case SC_ANKLE:
+		case SC_SPIDERWEB:
 			battle_stopwalking(bl,1);
 		break;
 		case SC_HIDING:

+ 1 - 0
src/map/vending.c

@@ -256,6 +256,7 @@ void vending_openvending(struct map_session_data *sd,int len,char *message,int f
 		sd->vend_num = i;
 		memcpy(sd->message,message, MESSAGE_SIZE-1);
 		if (clif_openvending(sd,sd->vender_id,sd->vending) > 0){
+			pc_stop_walking(sd,1);
 			clif_showvendingboard(&sd->bl,message,0);
 			if(use_irc && irc_announce_shop_flag)
 				irc_announce_shop(sd,1);