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.c104
1 files changed, 82 insertions, 22 deletions
diff --git a/src/map/pc.c b/src/map/pc.c
index 84cfe7eb3..d58e39227 100644
--- a/src/map/pc.c
+++ b/src/map/pc.c
@@ -1331,7 +1331,7 @@ int pc_calc_skilltree(struct map_session_data *sd)
if( sd->status.skill[i].flag != SKILL_FLAG_PLAGIARIZED && sd->status.skill[i].flag != SKILL_FLAG_PERM_GRANTED ) //Don't touch these
sd->status.skill[i].id = 0; //First clear skills.
/* permanent skills that must be re-checked */
- if( sd->status.skill[i].flag == SKILL_FLAG_PERM_GRANTED ) {
+ if( sd->status.skill[i].flag == SKILL_FLAG_PERMANENT ) {
switch( skill_db[i].nameid ) {
case NV_TRICKDEAD:
if( (sd->class_&MAPID_UPPERMASK) != MAPID_NOVICE ) {
@@ -1445,7 +1445,7 @@ int pc_calc_skilltree(struct map_session_data *sd)
continue; //Cannot be learned via normal means. Note this check DOES allows raising already known skills.
sd->status.skill[idx].id = id;
-
+
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[idx].lv = 1; // need to manually specify a skill level
sd->status.skill[idx].flag = SKILL_FLAG_TEMPORARY; //So it is not saved, and tagged as a "bonus" skill.
@@ -1536,6 +1536,7 @@ static void pc_check_skilltree(struct map_session_data *sd, int skill_id)
continue; //Cannot be learned via normal means.
sd->status.skill[idx].id = id;
+
flag = 1;
}
} while(flag);
@@ -4220,6 +4221,12 @@ int pc_isUseitem(struct map_session_data *sd,int n)
else if( itemdb_is_poison(nameid) && (sd->class_&MAPID_THIRDMASK) != MAPID_GUILLOTINE_CROSS )
return 0;
+ if( (item->package || item->group) && pc_is90overweight(sd) ) {
+ //##TODO## find official response to this
+ clif->colormes(sd->fd,COLOR_RED,msg_txt(1477));// Item cannot be open when overweight by 90%
+ return 0;
+ }
+
//Gender check
if(item->sex != 2 && sd->status.sex != item->sex)
return 0;
@@ -6139,7 +6146,74 @@ int pc_skillup(struct map_session_data *sd,uint16 skill_id) {
if( !(index = skill->get_index(skill_id)) )
return 0;
+
+ if( battle_config.skillup_limit ) {
+ /* [Ind/Hercules] */
+ if( (sd->class_&JOBL_2) && (sd->class_&MAPID_UPPERMASK) != MAPID_SUPER_NOVICE ){
+ while(1) {
+ int c, i = 0, k = 0, pts = 0, pts_second = 0, id = 0;
+ bool can_skip = false;
+
+ c = sd->class_ & MAPID_BASEMASK;
+
+ k = pc_class2idx(pc_mapid2jobid(c, sd->status.sex));
+
+ for(i = 0; i < MAX_SKILL_TREE && (id=skill_tree[k][i].id) > 0 ; i++){
+ int inf2 = skill->get_inf2(id), idx = skill_tree[k][i].idx;
+
+ if( skill_id == id ) {
+ can_skip = true;
+ break;/* its oki we can skip */
+ }
+
+ if ( inf2&INF2_QUEST_SKILL || (inf2&(INF2_WEDDING_SKILL|INF2_SPIRIT_SKILL)) || id == NV_BASIC )
+ continue;
+
+ if( sd->status.skill[idx].id && sd->status.skill[idx].flag == SKILL_FLAG_PERMANENT )
+ pts += pc_checkskill(sd, id);
+ }
+
+ if( can_skip ) break;
+
+ if( pts < 40 ) {
+ clif->msg_value(sd, 0x61E, 40 - pts);
+ return 0;
+ }
+
+ if( sd->class_&JOBL_THIRD ) {
+ bool is_trans = sd->class_&JOBL_UPPER? true : false;
+
+ c = is_trans ? (sd->class_ &~ JOBL_THIRD)/* find fancy way */ : sd->class_ & MAPID_UPPERMASK;
+
+ k = pc_class2idx(pc_mapid2jobid(c, sd->status.sex));
+ for(i = 0; i < MAX_SKILL_TREE && (id=skill_tree[k][i].id) > 0 ; i++){
+ int inf2 = skill->get_inf2(id), idx = skill_tree[k][i].idx;
+
+ if( skill_id == id ) {
+ can_skip = true;
+ break;/* its oki we can skip */
+ }
+
+ if ( inf2&INF2_QUEST_SKILL || (inf2&(INF2_WEDDING_SKILL|INF2_SPIRIT_SKILL)) || id == NV_BASIC )
+ continue;
+
+ if( sd->status.skill[idx].id && sd->status.skill[idx].flag == SKILL_FLAG_PERMANENT )
+ pts_second += pc_checkskill(sd, id);
+ }
+
+ if( can_skip ) break;
+
+ if( pts_second - pts < ( is_trans ? 70 : 50 ) ) {
+ clif->msg_value(sd, 0x61F, ( is_trans ? 70 : 50 ) - (pts_second - pts));
+ return 0;
+ }
+ }
+ break;
+ }
+ }
+ }
+
if( sd->status.skill_point > 0 &&
sd->status.skill[index].id &&
sd->status.skill[index].flag == SKILL_FLAG_PERMANENT && //Don't allow raising while you have granted skills. [Skotlex]
@@ -6160,21 +6234,7 @@ int pc_skillup(struct map_session_data *sd,uint16 skill_id) {
clif->updatestatus(sd,SP_CARTINFO);
if (!pc_has_permission(sd, PC_PERM_ALL_SKILL)) // may skill everything at any time anyways, and this would cause a huge slowdown
clif->skillinfoblock(sd);
- }else if( battle_config.skillup_limit ){
- int pts = 0, i, id;
- for(i = 0; i < MAX_SKILL_TREE && (id=skill_tree[pc_class2idx(sd->status.class_)][i].id) > 0 ; i++){
- int inf2 = skill->get_inf2(id);
- if ( inf2&INF2_QUEST_SKILL || (inf2&(INF2_WEDDING_SKILL|INF2_SPIRIT_SKILL)) || id == NV_BASIC )
- continue;
- if( sd->status.skill[id].id && sd->status.skill[id].flag == SKILL_FLAG_PERMANENT )
- pts += pc_checkskill(sd, id);
- }
- if( pts < sd->change_level_2nd )
- clif->msg_value(sd, 0x61E, sd->change_level_2nd-pts);
- else if( pts < (sd->change_level_3rd + sd->change_level_2nd) )
- clif->msg_value(sd, 0x61F, sd->change_level_3rd - (pts - sd->change_level_2nd));
}
-
return 0;
}
@@ -6987,10 +7047,10 @@ void pc_revive(struct map_session_data *sd,unsigned int hp, unsigned int sp) {
pc->setinvincibletimer(sd, battle_config.pc_invincible_time);
if( sd->state.gmaster_flag ) {
- guild->aura_refresh(sd,GD_LEADERSHIP,guild->checkskill(sd->state.gmaster_flag,GD_LEADERSHIP));
- guild->aura_refresh(sd,GD_GLORYWOUNDS,guild->checkskill(sd->state.gmaster_flag,GD_GLORYWOUNDS));
- guild->aura_refresh(sd,GD_SOULCOLD,guild->checkskill(sd->state.gmaster_flag,GD_SOULCOLD));
- guild->aura_refresh(sd,GD_HAWKEYES,guild->checkskill(sd->state.gmaster_flag,GD_HAWKEYES));
+ guild->aura_refresh(sd,GD_LEADERSHIP,guild->checkskill(sd->guild,GD_LEADERSHIP));
+ guild->aura_refresh(sd,GD_GLORYWOUNDS,guild->checkskill(sd->guild,GD_GLORYWOUNDS));
+ guild->aura_refresh(sd,GD_SOULCOLD,guild->checkskill(sd->guild,GD_SOULCOLD));
+ guild->aura_refresh(sd,GD_HAWKEYES,guild->checkskill(sd->guild,GD_HAWKEYES));
}
}
// script
@@ -8933,12 +8993,12 @@ int pc_checkitem(struct map_session_data *sd)
}
if (sd->state.gmaster_flag) {
- struct guild_storage *guild_storage = gstorage->id2storage2(sd->state.gmaster_flag->guild_id);
+ struct guild_storage *guild_storage = gstorage->id2storage2(sd->guild->guild_id);
if (guild_storage) {
for( i = 0; i < MAX_GUILD_STORAGE; i++ ) {
id = guild_storage->items[i].nameid;
if( id && !itemdb_available(id) ) {
- ShowWarning("Removed invalid/disabled item id %d from guild storage (amount=%d, char_id=%d, guild_id=%d).\n", id, guild_storage->items[i].amount, sd->status.char_id, sd->state.gmaster_flag->guild_id);
+ ShowWarning("Removed invalid/disabled item id %d from guild storage (amount=%d, char_id=%d, guild_id=%d).\n", id, guild_storage->items[i].amount, sd->status.char_id, sd->guild->guild_id);
gstorage->delitem(sd, guild_storage, i, guild_storage->items[i].amount);
gstorage->close(sd); // force closing
}