Selaa lähdekoodia

- The NPC elemental attacks will display a skill animation again.
- Mob instant cast skills will use their adelay now.
- Spirit of Wizard won't work on Ganbantein
- The pc normalize job function will consider you as novice if you don't have maxed out basic skill.
- Cleaned up pc_calc_skilltree and related functions so that the id is left as 0 when you can't raise the skill even if you meet the prerequisites. This is to prevent raising quest/soul/marriage skills through packets.
- Slaves should lock unto their master's target even if they are not attacking yet (eg: in chase mode)
- Updated the Summon Slave skill to use the slave distance define as valid distance to spawn from master.


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

skotlex 18 vuotta sitten
vanhempi
commit
9e0791f775
5 muutettua tiedostoa jossa 47 lisäystä ja 35 poistoa
  1. 12 0
      Changelog-Trunk.txt
  2. 6 14
      src/map/clif.c
  3. 2 2
      src/map/mob.c
  4. 20 9
      src/map/pc.c
  5. 7 10
      src/map/skill.c

+ 12 - 0
Changelog-Trunk.txt

@@ -4,6 +4,18 @@ AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
 2007/01/15
+	* The NPC elemental attacks will display a skill animation again.
+	* Mob instant cast skills will use their adelay now.
+	* Spirit of Wizard won't work on Ganbantein
+	* The pc normalize job function will consider you as novice if you don't
+	  have maxed out basic skill.
+	* Cleaned up pc_calc_skilltree and related functions so that the id is left
+	  as 0 when you can't raise the skill even if you meet the prerequisites.
+	  This is to prevent raising quest/soul/marriage skills through packets.
+	* Slaves should lock unto their master's target even if they are not
+	  attacking yet (eg: in chase mode)
+	* Updated the Summon Slave skill to use the slave distance define as valid
+	  distance to spawn from master.
 	* Fixed Joint Beat's speed penalty.
 	* Added a pc_authok check to prevent the case in which somehow another
 	  character of the same account manages to log in as well.

+ 6 - 14
src/map/clif.c

@@ -4301,7 +4301,7 @@ int clif_insight(struct block_list *bl,va_list ap)
  */
 int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range)
 {
-	int fd,id, inf2;
+	int fd,id;
 
 	nullpo_retr(0, sd);
 
@@ -4323,12 +4323,8 @@ int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range)
 
 	WFIFOW(fd,12)= range;
 	strncpy(WFIFOP(fd,14), skill_get_name(id), NAME_LENGTH);
-	inf2 = skill_get_inf2(id);
-	if(((!(inf2&INF2_QUEST_SKILL) || battle_config.quest_skill_learn) &&
-		!(inf2&(INF2_WEDDING_SKILL|INF2_SPIRIT_SKILL))) ||
-		(battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill))
-		//WFIFOB(fd,38)= (sd->status.skill[skillid].lv < skill_get_max(id) && sd->status.skill[skillid].flag ==0 )? 1:0;
-		WFIFOB(fd,38)= (sd->status.skill[skillid].lv < skill_tree_get_max(id, sd->status.class_) && sd->status.skill[skillid].flag ==0 )? 1:0;
+	if(sd->status.skill[skillid].flag ==0)
+		WFIFOB(fd,38)= (sd->status.skill[skillid].lv < skill_tree_get_max(id, sd->status.class_))? 1:0;
 	else
 		WFIFOB(fd,38) = 0;
 	WFIFOSET(fd,packet_len(0x147));
@@ -4343,7 +4339,7 @@ int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range)
 int clif_skillinfoblock(struct map_session_data *sd)
 {
 	int fd;
-	int i,c,len=4,id, inf2;
+	int i,c,len=4,id;
 
 	nullpo_retr(0, sd);
 
@@ -4361,11 +4357,8 @@ int clif_skillinfoblock(struct map_session_data *sd)
 			WFIFOW(fd,len+8) = skill_get_sp(id,sd->status.skill[i].lv);
 			WFIFOW(fd,len+10)= skill_get_range2(&sd->bl, id,sd->status.skill[i].lv);
 			strncpy(WFIFOP(fd,len+12), skill_get_name(id), NAME_LENGTH);
-			inf2 = skill_get_inf2(id);
-			if(((!(inf2&INF2_QUEST_SKILL) || battle_config.quest_skill_learn) &&
-				!(inf2&(INF2_WEDDING_SKILL|INF2_SPIRIT_SKILL))) ||
-				(battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill) )
-				WFIFOB(fd,len+36)= (sd->status.skill[i].lv < skill_tree_get_max(id, sd->status.class_) && sd->status.skill[i].flag ==0 )? 1:0;
+			if(sd->status.skill[i].flag ==0)
+				WFIFOB(fd,len+36)= (sd->status.skill[i].lv < skill_tree_get_max(id, sd->status.class_))? 1:0;
 			else
 				WFIFOB(fd,len+36) = 0;
 			len+=37;
@@ -4395,7 +4388,6 @@ int clif_skillup(struct map_session_data *sd,int skill_num)
 	WFIFOW(fd,4) = sd->status.skill[skill_num].lv;
 	WFIFOW(fd,6) = skill_get_sp(skill_num,sd->status.skill[skill_num].lv);
 	WFIFOW(fd,8) = skill_get_range2(&sd->bl,skill_num,sd->status.skill[skill_num].lv);
-	//WFIFOB(fd,10) = (sd->status.skill[skill_num].lv < skill_get_max(sd->status.skill[skill_num].id)) ? 1 : 0;
 	WFIFOB(fd,10) = (sd->status.skill[skill_num].lv < skill_tree_get_max(sd->status.skill[skill_num].id, sd->status.class_)) ? 1 : 0;
 	WFIFOSET(fd,packet_len(0x10e));
 

+ 2 - 2
src/map/mob.c

@@ -957,7 +957,7 @@ static int mob_ai_sub_hard_slavemob(struct mob_data *md,unsigned int tick)
 		
 		if (ud) {
 			struct block_list *tbl=NULL;
-			if (ud->target && ud->attacktimer != -1)
+			if (ud->target && ud->state.attack_continue)
 				tbl=map_id2bl(ud->target);
 			else if (ud->skilltarget) {
 				tbl = map_id2bl(ud->skilltarget);
@@ -2466,7 +2466,7 @@ int mob_summonslave(struct mob_data *md2,int *value,int amount,int skill_id)
 		if (mobdb_checkid(data.class_) == 0)
 			continue;
 
-		if (map_search_freecell(&md2->bl, 0, &x, &y, 4, 4, 0)) {
+		if (map_search_freecell(&md2->bl, 0, &x, &y, MOB_SLAVEDISTANCE, MOB_SLAVEDISTANCE, 0)) {
 			data.x = x;
 			data.y = y;
 		} else {

+ 20 - 9
src/map/pc.c

@@ -959,7 +959,7 @@ int pc_calc_skilltree(struct map_session_data *sd)
 	do {
 		flag = 0;
 		for(i = 0; i < MAX_SKILL_TREE && (id = skill_tree[c][i].id) > 0; i++) {
-			int j, f;
+			int j, f, inf2;
 
 			if(sd->status.skill[id].id)
 				continue; //Skill already known.
@@ -974,19 +974,25 @@ int pc_calc_skilltree(struct map_session_data *sd)
 				}
 				if (sd->status.job_level < skill_tree[c][i].joblv)
 					f = 0; // job level requirement wasn't satisfied
-				else if (pc_checkskill(sd, NV_BASIC) < 9 && id != NV_BASIC && !(skill_get_inf2(id)&INF2_QUEST_SKILL))
-					f = 0; // Do not unlock normal skills when Basic Skill is not maxed out (can happen because of skill reset)
 			}
 
 			if (f) {
+				inf2 = skill_get_inf2(id);
+
+				if(!sd->status.skill[id].lv && (
+					(inf2&INF2_QUEST_SKILL && !battle_config.quest_skill_learn) ||
+					inf2&INF2_WEDDING_SKILL ||
+					(inf2&INF2_SPIRIT_SKILL && !(sd->sc.count && sd->sc.data[SC_SPIRIT].timer != -1))
+				))
+					continue; //Cannot be learned via normal means. Note this check DOES allows raising already known skills.
+
 				sd->status.skill[id].id = id;
 
-				if(skill_get_inf2(id)&INF2_SPIRIT_SKILL && sd->sc.count && sd->sc.data[SC_SPIRIT].timer != -1)
+				if(inf2&INF2_SPIRIT_SKILL)
 				{	//Spirit skills cannot be learned, they will only show up on your tree when you get buffed.
 					sd->status.skill[id].lv = 1; // need to manually specify a skill level
 					sd->status.skill[id].flag = 1; //So it is not saved, and tagged as a "bonus" skill.
 				}
-
 				flag = 1; // skill list has changed, perform another pass
 			}
 		}
@@ -1046,9 +1052,14 @@ static void pc_check_skilltree(struct map_session_data *sd, int skill) {
 			if (sd->status.job_level < skill_tree[c][i].joblv)
 				continue;
 			
-			if(skill_get_inf2(id)&INF2_SPIRIT_SKILL)
-				//Spirit skills cannot be learned
-				continue;
+			j = skill_get_inf2(id);
+			if(!sd->status.skill[id].lv && (
+				(j&INF2_QUEST_SKILL && !battle_config.quest_skill_learn) ||
+				j&INF2_WEDDING_SKILL ||
+				(j&INF2_SPIRIT_SKILL && !(sd->sc.count && sd->sc.data[SC_SPIRIT].timer != -1))
+			))
+				continue; //Cannot be learned via normal means.
+
 			sd->status.skill[id].id=id;
 			flag=1;
 		}
@@ -4484,7 +4495,7 @@ int pc_skillup(struct map_session_data *sd,int skill_num)
 
 	if (skill_num < 0 || skill_num >= MAX_SKILL)
 		return 0;
-	
+
 	if(sd->status.skill_point>0 &&
 		sd->status.skill[skill_num].id &&
 		sd->status.skill[skill_num].flag==0 && //Don't allow raising while you have granted skills. [Skotlex]

+ 7 - 10
src/map/skill.c

@@ -2047,14 +2047,6 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 
 	case KN_AUTOCOUNTER:
 	case NPC_CRITICALSLASH:
-	case NPC_WATERATTACK:
-	case NPC_GROUNDATTACK:
-	case NPC_FIREATTACK:
-	case NPC_WINDATTACK:
-	case NPC_POISONATTACK:
-	case NPC_HOLYATTACK:
-	case NPC_DARKNESSATTACK:
-	case NPC_TELEKINESISATTACK:
 	case NPC_SPLASHATTACK:
 	case TF_DOUBLE:
 	case GS_CHAINACTION:
@@ -5641,7 +5633,9 @@ int skill_castend_id (int tid, unsigned int tick, int id, int data)
 
 		if(md) {
 			if(tid != -1) //Set afterskill delay.
-				md->last_thinktime=tick + md->status.amotion;
+				md->last_thinktime=tick +md->status.amotion;
+			else
+				md->last_thinktime=tick +md->status.adelay;
 			if(battle_config.mob_ai&0x200) { //pass on delay to same skill.
 				int i;
 				for (i = 0; i < md->db->maxskill; i++)
@@ -5832,6 +5826,8 @@ int skill_castend_pos (int tid, unsigned int tick, int id, int data)
 		if(md) {
 			if (tid != -1)
 				md->last_thinktime=tick +md->status.amotion;
+			else
+				md->last_thinktime=tick +md->status.adelay;
 			if(battle_config.mob_ai&0x200) { //pass on delay to same skill.
 				int i;
 				for (i = 0; i < md->db->maxskill; i++)
@@ -8537,7 +8533,8 @@ int skill_check_condition (struct map_session_data *sd, int skill, int lv, int t
 					clif_skill_fail(sd,skill,0,0);
 				return 0;
 			}
-			if(itemid[i] >= 715 && itemid[i] <= 717 && sc && sc->data[SC_SPIRIT].timer != -1 && sc->data[SC_SPIRIT].val2 == SL_WIZARD)
+			if(itemid[i] >= 715 && itemid[i] <= 717 && skill != HW_GANBANTEIN &&
+				sc && sc->data[SC_SPIRIT].timer != -1 && sc->data[SC_SPIRIT].val2 == SL_WIZARD)
 				index[i] = -1; //Gemstones are checked, but not substracted from inventory.
 		}
 	}