Changeset 24 for src/map/pc.c
- Timestamp:
- 07/07/08 22:48:26 (17 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
src/map/pc.c
r22 r24 133 133 } 134 134 135 void pc_setinvincibletimer(struct map_session_data* sd, int val) 135 void pc_setinvincibletimer(struct map_session_data* sd, int val) 136 136 { 137 137 nullpo_retv(sd); … … 258 258 case MAPID_TAEKWON: // Taekwon 259 259 clif_fame_taekwon(sd,count); 260 break; 260 break; 261 261 } 262 262 chrif_updatefamelist(sd); … … 267 267 { 268 268 int i; 269 269 270 270 switch(job){ 271 271 case MAPID_BLACKSMITH: // Blacksmith … … 330 330 sd->status.clothes_color=0; 331 331 332 //Only copy the Cart/Peco/Falcon options, the rest are handled via 332 //Only copy the Cart/Peco/Falcon options, the rest are handled via 333 333 //status change load/saving. [Skotlex] 334 334 sd->status.option = sd->sc.option&(OPTION_CART|OPTION_FALCON|OPTION_RIDING); 335 335 336 336 if (sd->sc.data[SC_JAILED]) 337 337 { //When Jailed, do not move last point. … … 403 403 if (!itemdb_isequip2(sd->inventory_data[n])) 404 404 return 0; //Not equippable by players. 405 405 406 406 ep = sd->inventory_data[n]->equip; 407 407 if(sd->inventory_data[n]->look == W_DAGGER || … … 518 518 if (itemdb_isspecial(item->card[0])) 519 519 return 1; 520 520 521 521 ARR_FIND( 0, s, i, item->card[i] && (data = itemdb_exists(item->card[i])) != NULL && data->flag.no_equip&flag ); 522 522 return( i < s ) ? 0 : 1; … … 535 535 if( i == EQI_HEAD_MID && sd->equip_index[EQI_HEAD_LOW] == index ) continue; 536 536 if( i == EQI_HEAD_TOP && (sd->equip_index[EQI_HEAD_MID] == index || sd->equip_index[EQI_HEAD_LOW] == index) ) continue; 537 537 538 538 if( !sd->inventory_data[index] ) continue; 539 539 … … 568 568 // Parents need to have their ring equipped 569 569 if( !pc_isequipped(p1_sd, WEDDING_RING_M) && !pc_isequipped(p1_sd, WEDDING_RING_F) ) 570 return false; 570 return false; 571 571 572 572 if( !pc_isequipped(p2_sd, WEDDING_RING_M) && !pc_isequipped(p2_sd, WEDDING_RING_F) ) … … 603 603 int job, joblevel; 604 604 unsigned int jobexp; 605 605 606 606 if( !pc_can_Adopt(p1_sd, p2_sd, b_sd) ) 607 607 return false; … … 632 632 pc_skill(p1_sd, WE_CALLBABY, 1, 0); 633 633 pc_skill(p2_sd, WE_CALLBABY, 1, 0); 634 634 635 635 return true; 636 636 } … … 660 660 return 0; 661 661 if(map_flag_gvg(sd->bl.m) && ((item->flag.no_equip&2) || !pc_isAllowedCardOn(sd,item->slot,n,2))) 662 return 0; 662 return 0; 663 663 if(map[sd->bl.m].flag.restricted) 664 664 { … … 669 669 670 670 if (sd->sc.count) { 671 671 672 672 if(item->equip & EQP_ARMS && item->type == IT_WEAPON && sd->sc.data[SC_STRIPWEAPON]) // Also works with left-hand weapons [DracoRPG] 673 673 return 0; … … 698 698 if (!(1<<(sd->class_&MAPID_BASEMASK)&item->class_base[(sd->class_&JOBL_2_1)?1:((sd->class_&JOBL_2_2)?2:0)])) 699 699 return 0; 700 700 701 701 //Not equipable by upper class. [Skotlex] 702 702 if(!(1<<((sd->class_&JOBL_UPPER)?1:((sd->class_&JOBL_BABY)?2:0))&item->class_upper)) … … 730 730 sd->class_ = MAPID_NOVICE; 731 731 } else 732 sd->class_ = i; 732 sd->class_ = i; 733 733 //Initializations to null/0 unneeded since map_session_data was filled with 0 upon allocation. 734 734 if(!sd->status.hp) pc_setdead(sd); … … 739 739 sd->npc_timer_id = -1; 740 740 sd->pvp_timer = -1; 741 741 742 742 sd->canuseitem_tick = tick; 743 743 sd->cantalk_tick = tick; … … 754 754 if (battle_config.disp_zeny) 755 755 sd->state.showzeny = 1; 756 //Checks the battleflags to see if player has selected to see summon's stats. 757 //I see nothing wrong here. 756 758 //Vanaheim settings [Brainstorm] 757 759 if (battle_config.disp_summon_stats) // Battle Flag to Show Summoned Monster Stats [Brain] 758 sd->state.showsummon = 1; 759 760 sd->state.showsummon = 1; 761 762 760 763 if (!(battle_config.display_skill_fail&2)) 761 764 sd->state.showdelay = 1; 762 765 763 766 // ACe`FbN 764 767 pc_setinventorydata(sd); 765 768 pc_checkitem(sd); 766 769 767 770 status_change_init(&sd->bl); 768 771 if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && (pc_isGM(sd) >= get_atcommand_level(atcommand_hide))) … … 819 822 sd->packet_ver, CONVIP(ip)); 820 823 } 821 824 822 825 // Send friends list 823 826 clif_friendslist_send(sd); … … 866 869 } 867 870 868 //Attempts to set a mob. 871 //Attempts to set a mob. 869 872 int pc_set_hate_mob(struct map_session_data *sd, int pos, struct block_list *bl) 870 873 { … … 898 901 { 899 902 int i,j; 900 903 901 904 sd->change_level = pc_readglobalreg(sd,"jobchange_level"); 902 905 sd->die_counter = pc_readglobalreg(sd,"PC_DIE_COUNTER"); … … 932 935 if (i < sd->status.skill[sd->cloneskill_id].lv) 933 936 sd->status.skill[sd->cloneskill_id].lv = i; 934 sd->status.skill[sd->cloneskill_id].flag = 13; //cloneskill flag 937 sd->status.skill[sd->cloneskill_id].flag = 13; //cloneskill flag 935 938 } 936 939 } … … 945 948 if (sd->status.guild_id) 946 949 guild_member_joined(sd); 947 950 948 951 // pet 949 952 if (sd->status.pet_id > 0) … … 1016 1019 } 1017 1020 c = pc_class2idx(c); 1018 for(i=0;i<MAX_SKILL;i++){ 1021 for(i=0;i<MAX_SKILL;i++){ 1019 1022 if (sd->status.skill[i].flag != 13) //Don't touch plagiarized skills 1020 1023 sd->status.skill[i].id=0; //First clear skills. 1021 1024 } 1022 1025 1023 for(i=0;i<MAX_SKILL;i++){ 1024 if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ //Restore original level of skills after deleting earned skills. 1026 for(i=0;i<MAX_SKILL;i++){ 1027 if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ //Restore original level of skills after deleting earned skills. 1025 1028 sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; 1026 1029 sd->status.skill[i].flag=0; … … 1111 1114 sd->status.skill[id].flag=1; //So it is not saved, and tagged as a "bonus" skill. 1112 1115 } else 1113 sd->status.skill[id].flag=sd->status.skill[id].lv+2; 1116 sd->status.skill[id].flag=sd->status.skill[id].lv+2; 1114 1117 sd->status.skill[id].lv= skill_tree_get_max(id, sd->status.class_); 1115 1118 } … … 1127 1130 if(battle_config.skillfree) 1128 1131 return; //Function serves no purpose if this is set 1129 1132 1130 1133 i = pc_calc_skilltree_normalize_job(sd); 1131 1134 c = pc_mapid2jobid(i, sd->status.sex); … … 1142 1145 if(sd->status.skill[id].id) //Already learned 1143 1146 continue; 1144 1147 1145 1148 for(j=0;j<5;j++) { 1146 1149 if((k=skill_tree[c][i].need[j].id)) … … 1163 1166 if (sd->status.job_level < skill_tree[c][i].joblv) 1164 1167 continue; 1165 1168 1166 1169 j = skill_get_inf2(id); 1167 1170 if(!sd->status.skill[id].lv && ( … … 1202 1205 int skill_point; 1203 1206 int c = sd->class_; 1204 1207 1205 1208 if (!battle_config.skillup_limit) 1206 1209 return c; 1207 1210 1208 1211 skill_point = pc_calc_skillpoint(sd); 1209 1212 if(pc_checkskill(sd, NV_BASIC) < 9) //Consider Novice Tree when you don't have NV_BASIC maxed. … … 1611 1614 break; 1612 1615 val += (int)status->max_hp; 1613 //Negative bonuses will underflow, this will be handled in status_calc_pc through casting 1616 //Negative bonuses will underflow, this will be handled in status_calc_pc through casting 1614 1617 //If this is called outside of status_calc_pc, you'd better pray they do not underflow and end with UINT_MAX max_hp. 1615 1618 status->max_hp = (unsigned int)val; 1616 1619 break; 1617 1620 case SP_MAXSP: 1618 if(sd->state.lr_flag == 2) 1621 if(sd->state.lr_flag == 2) 1619 1622 break; 1620 1623 val += (int)status->max_sp; … … 1658 1661 } 1659 1662 break; 1660 case SP_ADD_SPEED: //Raw increase1661 if(sd->state.lr_flag != 2) {1662 bonus = status->speed - val;1663 status->speed = cap_value(bonus, 0, USHRT_MAX);1664 }1665 break;1666 1663 case SP_SPEED_RATE: //Non stackable increase 1667 if(sd->state.lr_flag != 2 && sd->speed_rate > 100-val)1668 sd->speed_rate = 100-val;1664 if(sd->state.lr_flag != 2) 1665 sd->speed_rate = min(sd->speed_rate, -val); 1669 1666 break; 1670 1667 case SP_SPEED_ADDRATE: //Stackable increase … … 2674 2671 if(idx_card < 0 || idx_card >= MAX_INVENTORY || !sd->inventory_data[idx_card]) 2675 2672 return 0; //Invalid card index. 2676 2673 2677 2674 if(idx_equip < 0 || idx_equip >= MAX_INVENTORY || !sd->inventory_data[idx_equip]) 2678 2675 return 0; //Invalid item index. 2679 2676 2680 2677 nameid=sd->status.inventory[idx_equip].nameid; 2681 2678 cardid=sd->status.inventory[idx_card].nameid; … … 2902 2899 if(amount > MAX_AMOUNT) 2903 2900 return 5; 2904 2901 2905 2902 data = itemdb_search(item_data->nameid); 2906 2903 w = data->weight*amount; … … 2997 2994 return 0; //Can't drop items in nodrop mapflag maps. 2998 2995 } 2999 2996 3000 2997 if (!pc_candrop(sd,&sd->status.inventory[n])) { 3001 2998 clif_displaymessage (sd->fd, msg_txt(263)); 3002 2999 return 0; 3003 3000 } 3004 3001 3005 3002 //Logs items, dropped by (P)layers [Lupus] 3006 3003 if(log_config.enable_logs&0x8) … … 3010 3007 if (!map_addflooritem(&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 2)) 3011 3008 return 0; 3012 3009 3013 3010 pc_delitem(sd, n, amount, 0); 3014 3011 return 1; … … 3033 3030 if (sd->status.party_id) 3034 3031 p = party_search(sd->status.party_id); 3035 3032 3036 3033 if(fitem->first_get_charid > 0 && fitem->first_get_charid != sd->status.char_id) 3037 3034 { … … 3123 3120 if ((nameid == 605 || nameid == 606) && pc_issit(sd)) 3124 3121 return 0; 3125 3122 3126 3123 //added item_noequip.txt items check by Maya&[Lupus] 3127 3124 if ( … … 3145 3142 )) 3146 3143 return 0; 3147 3144 3148 3145 //Not usable by upper class. [Skotlex] 3149 3146 if(!( … … 3329 3326 if (idx < 0 || idx >= MAX_INVENTORY) //Invalid index check [Skotlex] 3330 3327 return 1; 3331 3328 3332 3329 item_data = &sd->status.inventory[idx]; 3333 3330 … … 3369 3366 if (idx < 0 || idx >= MAX_CART) //Invalid index check [Skotlex] 3370 3367 return 1; 3371 3368 3372 3369 item_data=&sd->status.cart[idx]; 3373 3370 … … 3421 3418 if(md->state.steal_flag == UCHAR_MAX || md->sc.opt1) //already stolen from / status change check 3422 3419 return 0; 3423 3420 3424 3421 sd_status= status_get_status_data(&sd->bl); 3425 3422 md_status= status_get_status_data(bl); … … 3438 3435 rate = (sd_status->dex - md_status->dex)/2 + lv*6 + 4; 3439 3436 rate += sd->add_steal_rate; 3440 3437 3441 3438 if( rate < 1 ) 3442 3439 return 0; … … 3464 3461 return 0; 3465 3462 } 3466 3463 3467 3464 if(battle_config.show_steal_in_same_party) 3468 3465 party_foreachsamemap(pc_show_steal,sd,AREA_SIZE,sd,tmp_item.nameid); … … 3473 3470 log_pick_pc(sd, "P", itemid, 1, NULL); 3474 3471 } 3475 3472 3476 3473 //A Rare Steal Global Announce by Lupus 3477 3474 if(md->db->dropitem[i].p<=battle_config.rare_drop_announce) { … … 3604 3601 //Tag player for rewarping after map-loading is done. [Skotlex] 3605 3602 sd->state.rewarp = 1; 3606 3603 3607 3604 sd->mapindex = mapindex; 3608 3605 sd->bl.m = m; … … 3762 3759 if(!sd->sc.count) 3763 3760 return 0; 3764 3761 3765 3762 for (i = 0; i < ARRAYLENGTH(scw_list); i++) 3766 3763 { // Skills requiring specific weapon types … … 3769 3766 status_change_end(&sd->bl,scw_list[i],-1); 3770 3767 } 3771 3768 3772 3769 if(sd->sc.data[SC_SPURT] && sd->status.weapon) 3773 3770 // Spurt requires bare hands (feet, in fact xD) 3774 3771 status_change_end(&sd->bl,SC_SPURT,-1); 3775 3772 3776 3773 if(sd->status.shield <= 0) { // Skills requiring a shield 3777 3774 for (i = 0; i < ARRAYLENGTH(scs_list); i++) … … 3861 3858 class_ |= MAPID_THIEF; 3862 3859 break; 3863 3860 3864 3861 case JOB_STAR_GLADIATOR: 3865 3862 case JOB_STAR_GLADIATOR2: 3866 3863 class_ |= JOBL_2_1; 3867 3864 class_ |= MAPID_TAEKWON; 3868 break; 3865 break; 3869 3866 case JOB_SOUL_LINKER: 3870 3867 class_ |= JOBL_2_2; … … 3890 3887 class_ = MAPID_SUMMER; 3891 3888 break; 3892 //Possible to be in the wrong spot? 3889 //This is where your errors begin. 3893 3890 case JOB_NECROMANCER: // Necromancer [Brain] 3894 3891 class_ |= JOBL_2_1; 3895 3892 class_ |= MAPID_ADEPT; 3896 break; 3893 break; 3897 3894 case JOB_WARLOCK: // Warlock [Brain] 3898 3895 class_ |= JOBL_2_2; … … 3923 3920 case MAPID_XMAS: return JOB_XMAS; 3924 3921 case MAPID_SUMMER: return JOB_SUMMER; 3922 // double check this too. 3925 3923 case MAPID_ADEPT: return JOB_ADEPT; // Adept [Brain] 3926 3924 //2_1 classes … … 3933 3931 case MAPID_ASSASSIN: return JOB_ASSASSIN; 3934 3932 case MAPID_STAR_GLADIATOR: return JOB_STAR_GLADIATOR; 3933 //and this 3935 3934 case MAPID_NECROMANCER: return JOB_NECROMANCER; // Necromancer [Brain] 3936 3935 //2_2 classes … … 3942 3941 case MAPID_ROGUE: return JOB_ROGUE; 3943 3942 case MAPID_SOUL_LINKER: return JOB_SOUL_LINKER; 3943 //this too 3944 3944 case MAPID_WARLOCK: return JOB_WARLOCK; // Warlock [Brain] 3945 3945 //1-1: advanced … … 4007 4007 case JOB_THIEF: 4008 4008 return msg_txt(550 - JOB_NOVICE+class_); 4009 4009 4010 4010 case JOB_KNIGHT: 4011 4011 case JOB_PRIEST: … … 4015 4015 case JOB_ASSASSIN: 4016 4016 return msg_txt(557 - JOB_KNIGHT+class_); 4017 4017 4018 4018 case JOB_KNIGHT2: 4019 4019 return msg_txt(557); 4020 4020 4021 4021 case JOB_CRUSADER: 4022 4022 case JOB_MONK: … … 4027 4027 case JOB_DANCER: 4028 4028 return msg_txt(563 - JOB_CRUSADER+class_); 4029 4029 4030 4030 case JOB_CRUSADER2: 4031 4031 return msg_txt(563); 4032 4032 4033 4033 case JOB_WEDDING: 4034 4034 case JOB_SUPER_NOVICE: … … 4056 4056 case JOB_ASSASSIN_CROSS: 4057 4057 return msg_txt(582 - JOB_LORD_KNIGHT+class_); 4058 4058 4059 4059 case JOB_LORD_KNIGHT2: 4060 4060 return msg_txt(582); 4061 4061 4062 4062 case JOB_PALADIN: 4063 4063 case JOB_CHAMPION: … … 4068 4068 case JOB_GYPSY: 4069 4069 return msg_txt(588 - JOB_PALADIN + class_); 4070 4070 4071 4071 case JOB_PALADIN2: 4072 4072 return msg_txt(588); … … 4080 4080 case JOB_BABY_THIEF: 4081 4081 return msg_txt(595 - JOB_BABY + class_); 4082 4082 4083 4083 case JOB_BABY_KNIGHT: 4084 4084 case JOB_BABY_PRIEST: … … 4088 4088 case JOB_BABY_ASSASSIN: 4089 4089 return msg_txt(602 - JOB_BABY_KNIGHT + class_); 4090 4090 4091 4091 case JOB_BABY_KNIGHT2: 4092 4092 return msg_txt(602); 4093 4093 4094 4094 case JOB_BABY_CRUSADER: 4095 4095 case JOB_BABY_MONK: … … 4100 4100 case JOB_BABY_DANCER: 4101 4101 return msg_txt(608 - JOB_BABY_CRUSADER +class_); 4102 4102 4103 4103 case JOB_BABY_CRUSADER2: 4104 4104 return msg_txt(608); 4105 4105 4106 4106 case JOB_SUPER_BABY: 4107 4107 return msg_txt(615); 4108 4108 4109 4109 case JOB_TAEKWON: 4110 4110 return msg_txt(616); … … 4114 4114 case JOB_SOUL_LINKER: 4115 4115 return msg_txt(618); 4116 4116 4117 4117 case JOB_GUNSLINGER: 4118 4118 return msg_txt(619); 4119 4119 case JOB_NINJA: 4120 4120 return msg_txt(620); 4121 //message display for job change? 4121 4122 case JOB_ADEPT: // Adept [Brain] 4122 return msg_txt(1000); 4123 return msg_txt(1000);//have to add these to the msg_txt in the conf? 4123 4124 case JOB_NECROMANCER: // Necromancer [Brain] 4124 4125 return msg_txt(1001); … … 4126 4127 return msg_txt(1002); 4127 4128 4129 4128 4130 default: 4129 4131 return msg_txt(650); … … 4219 4221 if (sd->status.status_point > USHRT_MAX - next) 4220 4222 sd->status.status_point = USHRT_MAX; 4221 else 4223 else 4222 4224 sd->status.status_point += next; 4223 4225 … … 4226 4228 if (battle_config.pet_lv_rate && sd->pd) //<Skotlex> update pet's level 4227 4229 status_calc_pet(sd->pd,0); 4228 4230 4229 4231 clif_updatestatus(sd,SP_STATUSPOINT); 4230 4232 clif_updatestatus(sd,SP_BASELEVEL); … … 4296 4298 4297 4299 if (sd->expaddrace[status->race]) 4298 bonus += sd->expaddrace[status->race]; 4300 bonus += sd->expaddrace[status->race]; 4299 4301 bonus += sd->expaddrace[status->mode&MD_BOSS?RC_BOSS:RC_NONBOSS]; 4300 4301 if (battle_config.pk_mode && 4302 4303 if (battle_config.pk_mode && 4302 4304 (int)(status_get_lv(src) - sd->status.base_level) >= 20) 4303 bonus += 15; // pk_mode additional exp if monster >20 levels [Valaris] 4305 bonus += 15; // pk_mode additional exp if monster >20 levels [Valaris] 4304 4306 4305 4307 if (sd->sc.data[SC_EXPBOOST]) … … 4308 4310 if (!bonus) 4309 4311 return; 4310 4312 4311 4313 *base_exp += (unsigned int) cap_value((double)*base_exp * bonus/100., 1, UINT_MAX); 4312 4314 *job_exp += (unsigned int) cap_value((double)*job_exp * bonus/100., 1, UINT_MAX); … … 4337 4339 nextb = pc_nextbaseexp(sd); 4338 4340 nextj = pc_nextjobexp(sd); 4339 4341 4340 4342 if(sd->state.showexp || battle_config.max_exp_gain_rate){ 4341 4343 if (nextb > 0) … … 4359 4361 } 4360 4362 } 4361 4363 4362 4364 //Cap exp to the level up requirement of the previous level when you are at max level, otherwise cap at UINT_MAX (this is required for some S. Novice bonuses). [Skotlex] 4363 4365 if (base_exp) { … … 4525 4527 4526 4528 max = pc_maxparameter(sd); 4527 4529 4528 4530 switch(type){ 4529 4531 case SP_STR: sd->status.str = cap_value(sd->status.str + val, 1, max); break; … … 4625 4627 } 4626 4628 status_calc_pc(sd,0); 4627 //Required because if you could level up all skills previously, 4629 //Required because if you could level up all skills previously, 4628 4630 //the update will not be sent as only the lv variable changes. 4629 4631 clif_skillinfoblock(sd); … … 4722 4724 { 4723 4725 nullpo_retr(0, sd); 4724 4726 4725 4727 if (battle_config.use_statpoint_table) 4726 4728 { // New statpoint table used here - Dexity … … 4735 4737 if (sd->class_&JOBL_UPPER) 4736 4738 stat+=52; // extra 52+48=100 stat points 4737 4739 4738 4740 if (stat > USHRT_MAX) 4739 4741 sd->status.status_point = USHRT_MAX; … … 4775 4777 clif_updatestatus(sd,SP_UDEX); 4776 4778 clif_updatestatus(sd,SP_ULUK); // End Addition 4777 4779 4778 4780 clif_updatestatus(sd,SP_STATUSPOINT); 4779 4781 status_calc_pc(sd,0); … … 4810 4812 merc_hom_vaporize(sd, 0); 4811 4813 } 4812 4814 4813 4815 for (i = 1; i < MAX_SKILL; i++) { 4814 4816 lv= sd->status.skill[i].lv; … … 4839 4841 } 4840 4842 } 4841 4843 4842 4844 if (flag&2 || !skill_point) return skill_point; 4843 4845 … … 4945 4947 if(!src || src == &sd->bl) 4946 4948 return; 4947 4949 4948 4950 if(sd->status.pet_id > 0 && sd->pd && battle_config.pet_damage_support) 4949 4951 pet_target_check(sd,src,1); … … 4957 4959 int i=0,j=0,k=0; 4958 4960 unsigned int tick = gettick(); 4959 4961 4960 4962 if(sd->vender_id) 4961 4963 vending_closevending(sd); … … 4981 4983 } 4982 4984 4983 if(sd->status.hom_id > 0 ) //orn4985 if(sd->status.hom_id > 0 && battle_config.homunculus_auto_vapor) //orn 4984 4986 merc_hom_vaporize(sd, 0); 4985 4987 … … 5052 5054 // karma going down = more 'good' / more honourable. 5053 5055 // The Karma System way... 5054 5056 5055 5057 if (sd->status.karma > ssd->status.karma) { // If player killed was more evil 5056 5058 sd->status.karma--; … … 5059 5061 else if (sd->status.karma < ssd->status.karma) // If player killed was more good 5060 5062 ssd->status.karma++; 5061 5063 5062 5064 5063 5065 // or the PK System way... 5064 5066 5065 5067 if (sd->status.karma > 0) // player killed is dishonourable? 5066 5068 ssd->status.karma--; // honour points earned 5067 5069 sd->status.karma++; // honour points lost 5068 5070 5069 5071 // To-do: Receive exp on certain occasions 5070 5072 #endif … … 5313 5315 stat += (sd->status.base_level + i + 14) / 5 ; 5314 5316 if (sd->status.status_point > USHRT_MAX - stat) 5315 5317 5316 5318 sd->status.status_point = USHRT_MAX; 5317 5319 else … … 5515 5517 status_percent_damage(NULL, &sd->bl, hp, 0, hp==-100); 5516 5518 } 5517 5519 5518 5520 if(sp) { 5519 5521 if(sp > 0) … … 5547 5549 switch (upper) { 5548 5550 case 1: 5549 b_class|= JOBL_UPPER; 5551 b_class|= JOBL_UPPER; 5550 5552 break; 5551 5553 case 2: … … 5554 5556 } 5555 5557 //This will automatically adjust bard/dancer classes to the correct gender 5556 //That is, if you try to jobchange into dancer, it will turn you to bard. 5558 //That is, if you try to jobchange into dancer, it will turn you to bard. 5557 5559 job = pc_mapid2jobid(b_class, sd->status.sex); 5558 5560 if (job == -1) 5559 5561 return 1; 5560 5562 5561 5563 if ((unsigned short)b_class == sd->class_) 5562 5564 return 1; //Nothing to change. … … 5586 5588 } 5587 5589 } 5588 5590 5589 5591 sd->status.class_ = job; 5590 5592 fame_flag = pc_famerank(sd->status.char_id,sd->class_&MAPID_UPPERMASK); … … 5602 5604 } 5603 5605 5604 //Change look, if disguised, you need to undisguise 5606 //Change look, if disguised, you need to undisguise 5605 5607 //to correctly calculate new job sprite without 5606 5608 if (sd->disguise) … … 5630 5632 if(merc_is_hom_active(sd->hd) && !pc_checkskill(sd, AM_CALLHOMUN)) 5631 5633 merc_hom_vaporize(sd, 0); 5632 5634 5633 5635 if(sd->status.manner < 0) 5634 5636 clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner); … … 5789 5791 else if (!(type&OPTION_FLYING) && p_type&OPTION_FLYING) 5790 5792 new_look = -1; 5791 5793 5792 5794 if (type&OPTION_WEDDING && !(p_type&OPTION_WEDDING)) 5793 5795 new_look = JOB_WEDDING; … … 6023 6025 struct global_reg *sd_reg; 6024 6026 int i,max; 6025 6027 6026 6028 nullpo_retr(0, sd); 6027 6029 switch (type) { … … 6100 6102 return 1; 6101 6103 } 6102 6104 6103 6105 // delete reg 6104 6106 if (val == 0) { … … 6172 6174 return 0; 6173 6175 } 6174 6176 6175 6177 // delete reg 6176 6178 if (!val || strcmp(val,"")==0) … … 6366 6368 if(pos == EQP_ACC) { //Accesories should only go in one of the two, 6367 6369 pos = req_pos&EQP_ACC; 6368 if (pos == EQP_ACC) //User specified both slots.. 6370 if (pos == EQP_ACC) //User specified both slots.. 6369 6371 pos = sd->equip_index[EQI_ACC_R] >= 0 ? EQP_ACC_L : EQP_ACC_R; 6370 6372 } … … 6551 6553 clif_unequipitemack(sd,n,sd->status.inventory[n].equip,1); 6552 6554 6553 if((sd->status.inventory[n].equip & EQP_ARMS) && 6555 if((sd->status.inventory[n].equip & EQP_ARMS) && 6554 6556 sd->weapontype1 == 0 && sd->weapontype2 == 0 && (!sd->sc.data[SC_SEVENWIND] || sd->sc.data[SC_ASPERSIO])) //Check for seven wind (but not level seven!) 6555 6557 skill_enchant_elemental_end(&sd->bl,-1); … … 6607 6609 if (sd->vender_id) //Avoid reorganizing items when we are vending, as that leads to exploits (pointed out by End of Exam) 6608 6610 return 0; 6609 6611 6610 6612 // ió«lß 6611 6613 for(i=j=0;i<MAX_INVENTORY;i++){ … … 6852 6854 hp = sd->battle_status.hp-1; //Script drains cannot kill you. 6853 6855 } 6854 6856 6855 6857 if (sd->sp_loss.value) { 6856 6858 sd->sp_loss.tick += diff_tick; … … 6881 6883 } 6882 6884 } 6883 6885 6884 6886 if (sd->sp_regen.value) { 6885 6887 sd->sp_regen.tick += diff_tick; … … 6987 6989 if (data == 0 && battle_config.day_duration <= 0) // if we want a day 6988 6990 return 0; 6989 6991 6990 6992 if (!night_flag) 6991 6993 return 0; //Already day. 6992 6994 6993 6995 night_flag = 0; // 0=day, 1=night [Yor] 6994 6996 map_foreachpc(pc_daynight_timer_sub); … … 7008 7010 if (data == 0 && battle_config.night_duration <= 0) // if we want a night 7009 7011 return 0; 7010 7012 7011 7013 if (night_flag) 7012 7014 return 0; //Already nigth. … … 7037 7039 time_t timer; 7038 7040 struct tm *t; 7039 7041 7040 7042 time(&timer); 7041 7043 t = localtime(&timer); 7042 7043 pc_setglobalreg(sd, "PC_LAST_DUEL_TIME", t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min); 7044 7045 pc_setglobalreg(sd, "PC_LAST_DUEL_TIME", t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min); 7044 7046 return; 7045 7047 } … … 7050 7052 time_t timer; 7051 7053 struct tm *t; 7052 7054 7053 7055 time(&timer); 7054 7056 t = localtime(&timer); 7055 7057 7056 7058 diff = t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min - pc_readglobalreg(sd, "PC_LAST_DUEL_TIME"); 7057 7059 7058 7060 return !(diff >= 0 && diff < battle_config.duel_time_interval); 7059 7061 } … … 7065 7067 7066 7068 if (sd->duel_group != ssd->duel_group) return 0; 7067 7069 7068 7070 sprintf(output, " %d. %s", ++(*p), sd->status.name); 7069 7071 clif_disp_onlyself(ssd, output, strlen(output)); … … 7097 7099 int i=1; 7098 7100 char output[256]; 7099 7101 7100 7102 while(duel_list[i].members_count > 0 && i < MAX_DUEL) i++; 7101 7103 if(i == MAX_DUEL) return 0; 7102 7104 7103 7105 duel_count++; 7104 7106 sd->duel_group = i; … … 7106 7108 duel_list[i].invites_count = 0; 7107 7109 duel_list[i].max_players_limit = maxpl; 7108 7110 7109 7111 strcpy(output, msg_txt(372)); // " -- Duel has been created (@invite/@leave) --" 7110 7112 clif_disp_onlyself(sd, output, strlen(output)); 7111 7113 7112 7114 clif_set0199(sd, 1); 7113 7115 //clif_misceffect2(&sd->bl, 159); … … 7125 7127 target_sd->duel_invite = did; 7126 7128 duel_list[did].invites_count++; 7127 7129 7128 7130 // "Blue -- Player %s invites you to PVP duel (@accept/@reject) --" 7129 7131 sprintf(output, msg_txt(374), sd->status.name); … … 7143 7145 { 7144 7146 char output[256]; 7145 7147 7146 7148 // " <- Player %s has left duel --" 7147 7149 sprintf(output, msg_txt(375), sd->status.name); 7148 7150 clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); 7149 7151 7150 7152 duel_list[did].members_count--; 7151 7153 7152 7154 if(duel_list[did].members_count == 0) { 7153 map_foreachpc(duel_leave_sub, did); 7155 map_foreachpc(duel_leave_sub, did); 7154 7156 duel_count--; 7155 7157 } 7156 7158 7157 7159 sd->duel_group = 0; 7158 7160 duel_savetime(sd); … … 7164 7166 { 7165 7167 char output[256]; 7166 7168 7167 7169 duel_list[did].members_count++; 7168 7170 sd->duel_group = sd->duel_invite; 7169 7171 duel_list[did].invites_count--; 7170 7172 sd->duel_invite = 0; 7171 7173 7172 7174 // " -> Player %s has accepted duel --" 7173 7175 sprintf(output, msg_txt(376), sd->status.name); … … 7182 7184 { 7183 7185 char output[256]; 7184 7186 7185 7187 // " -- Player %s has rejected duel --" 7186 7188 sprintf(output, msg_txt(377), sd->status.name); 7187 7189 clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); 7188 7190 7189 7191 duel_list[did].invites_count--; 7190 7192 sd->duel_invite = 0; … … 7284 7286 if (pc_split_str(line,split,4) < 4) 7285 7287 continue; 7286 7288 7287 7289 job_count = pc_split_atoi(split[1],jobs,':',CLASS_COUNT); 7288 7290 if (job_count < 1) … … 7303 7305 maxlv = MAX_LEVEL; 7304 7306 } 7305 7307 7306 7308 job = jobs[0] = pc_class2idx(job_id); 7307 7309 //We send one less and then one more because the last entry in the exp array should hold 0. … … 7464 7466 if (i > MAX_LEVEL) 7465 7467 break; 7466 statp[i]=j; 7468 statp[i]=j; 7467 7469 i++; 7468 7470 } … … 7473 7475 for (; i <= MAX_LEVEL; i++) { 7474 7476 j += (i+15)/5; 7475 statp[i] = j; 7477 statp[i] = j; 7476 7478 } 7477 7479 … … 7505 7507 else 7506 7508 ShowWarning("In function pc_read_motd() -> File '"CL_WHITE"%s"CL_RESET"' not found.\n", motd_txt); 7507 7509 7508 7510 return 0; 7509 7511 }