Changeset 19 for src/map/pc.c
- Timestamp:
- 07/02/08 12:20:18 (17 years ago)
- Files:
-
- 1 modified
Legend:
- Unmodified
- Added
- Removed
-
src/map/pc.c
r13 r19 1 // Copyright (c) Athena Dev Teams - Licensed under GNU GPL 1 // Copyright (c) Athena Dev Teams - Licensed under GNU GPL =D 2 2 // For more information, see LICENCE in the main folder 3 3 … … 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 <<<<<<< .mine 757 //Vanaheim settings [Brainstorm] 758 if (battle_config.disp_summon_stats) // Battle Flag to Show Summoned Monster Stats [Brain] 759 sd->state.showsummon = 1; 760 761 ======= 756 762 //Custom Job (blackmagick) 757 763 //Vanaheim settings [Brainstorm] … … 759 765 sd->state.showsummon = 1; 760 766 767 >>>>>>> .r18 761 768 if (!(battle_config.display_skill_fail&2)) 762 769 sd->state.showdelay = 1; 763 770 764 771 // ACe`FbN 765 772 pc_setinventorydata(sd); 766 773 pc_checkitem(sd); 767 774 768 775 status_change_init(&sd->bl); 769 776 if ((battle_config.atc_gmonly == 0 || pc_isGM(sd)) && (pc_isGM(sd) >= get_atcommand_level(atcommand_hide))) … … 820 827 sd->packet_ver, CONVIP(ip)); 821 828 } 822 829 823 830 // Send friends list 824 831 clif_friendslist_send(sd); … … 867 874 } 868 875 869 //Attempts to set a mob. 876 //Attempts to set a mob. 870 877 int pc_set_hate_mob(struct map_session_data *sd, int pos, struct block_list *bl) 871 878 { … … 899 906 { 900 907 int i,j; 901 908 902 909 sd->change_level = pc_readglobalreg(sd,"jobchange_level"); 903 910 sd->die_counter = pc_readglobalreg(sd,"PC_DIE_COUNTER"); … … 933 940 if (i < sd->status.skill[sd->cloneskill_id].lv) 934 941 sd->status.skill[sd->cloneskill_id].lv = i; 935 sd->status.skill[sd->cloneskill_id].flag = 13; //cloneskill flag 942 sd->status.skill[sd->cloneskill_id].flag = 13; //cloneskill flag 936 943 } 937 944 } … … 946 953 if (sd->status.guild_id) 947 954 guild_member_joined(sd); 948 955 949 956 // pet 950 957 if (sd->status.pet_id > 0) … … 1017 1024 } 1018 1025 c = pc_class2idx(c); 1019 for(i=0;i<MAX_SKILL;i++){ 1026 for(i=0;i<MAX_SKILL;i++){ 1020 1027 if (sd->status.skill[i].flag != 13) //Don't touch plagiarized skills 1021 1028 sd->status.skill[i].id=0; //First clear skills. 1022 1029 } 1023 1030 1024 for(i=0;i<MAX_SKILL;i++){ 1025 if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ //Restore original level of skills after deleting earned skills. 1031 for(i=0;i<MAX_SKILL;i++){ 1032 if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ //Restore original level of skills after deleting earned skills. 1026 1033 sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; 1027 1034 sd->status.skill[i].flag=0; … … 1112 1119 sd->status.skill[id].flag=1; //So it is not saved, and tagged as a "bonus" skill. 1113 1120 } else 1114 sd->status.skill[id].flag=sd->status.skill[id].lv+2; 1121 sd->status.skill[id].flag=sd->status.skill[id].lv+2; 1115 1122 sd->status.skill[id].lv= skill_tree_get_max(id, sd->status.class_); 1116 1123 } … … 1128 1135 if(battle_config.skillfree) 1129 1136 return; //Function serves no purpose if this is set 1130 1137 1131 1138 i = pc_calc_skilltree_normalize_job(sd); 1132 1139 c = pc_mapid2jobid(i, sd->status.sex); … … 1143 1150 if(sd->status.skill[id].id) //Already learned 1144 1151 continue; 1145 1152 1146 1153 for(j=0;j<5;j++) { 1147 1154 if((k=skill_tree[c][i].need[j].id)) … … 1164 1171 if (sd->status.job_level < skill_tree[c][i].joblv) 1165 1172 continue; 1166 1173 1167 1174 j = skill_get_inf2(id); 1168 1175 if(!sd->status.skill[id].lv && ( … … 1203 1210 int skill_point; 1204 1211 int c = sd->class_; 1205 1212 1206 1213 if (!battle_config.skillup_limit) 1207 1214 return c; 1208 1215 1209 1216 skill_point = pc_calc_skillpoint(sd); 1210 1217 if(pc_checkskill(sd, NV_BASIC) < 9) //Consider Novice Tree when you don't have NV_BASIC maxed. … … 1612 1619 break; 1613 1620 val += (int)status->max_hp; 1614 //Negative bonuses will underflow, this will be handled in status_calc_pc through casting 1621 //Negative bonuses will underflow, this will be handled in status_calc_pc through casting 1615 1622 //If this is called outside of status_calc_pc, you'd better pray they do not underflow and end with UINT_MAX max_hp. 1616 1623 status->max_hp = (unsigned int)val; 1617 1624 break; 1618 1625 case SP_MAXSP: 1619 if(sd->state.lr_flag == 2) 1626 if(sd->state.lr_flag == 2) 1620 1627 break; 1621 1628 val += (int)status->max_sp; … … 2675 2682 if(idx_card < 0 || idx_card >= MAX_INVENTORY || !sd->inventory_data[idx_card]) 2676 2683 return 0; //Invalid card index. 2677 2684 2678 2685 if(idx_equip < 0 || idx_equip >= MAX_INVENTORY || !sd->inventory_data[idx_equip]) 2679 2686 return 0; //Invalid item index. 2680 2687 2681 2688 nameid=sd->status.inventory[idx_equip].nameid; 2682 2689 cardid=sd->status.inventory[idx_card].nameid; … … 2903 2910 if(amount > MAX_AMOUNT) 2904 2911 return 5; 2905 2912 2906 2913 data = itemdb_search(item_data->nameid); 2907 2914 w = data->weight*amount; … … 2998 3005 return 0; //Can't drop items in nodrop mapflag maps. 2999 3006 } 3000 3007 3001 3008 if (!pc_candrop(sd,&sd->status.inventory[n])) { 3002 3009 clif_displaymessage (sd->fd, msg_txt(263)); 3003 3010 return 0; 3004 3011 } 3005 3012 3006 3013 //Logs items, dropped by (P)layers [Lupus] 3007 3014 if(log_config.enable_logs&0x8) … … 3011 3018 if (!map_addflooritem(&sd->status.inventory[n], amount, sd->bl.m, sd->bl.x, sd->bl.y, 0, 0, 0, 2)) 3012 3019 return 0; 3013 3020 3014 3021 pc_delitem(sd, n, amount, 0); 3015 3022 return 1; … … 3034 3041 if (sd->status.party_id) 3035 3042 p = party_search(sd->status.party_id); 3036 3043 3037 3044 if(fitem->first_get_charid > 0 && fitem->first_get_charid != sd->status.char_id) 3038 3045 { … … 3124 3131 if ((nameid == 605 || nameid == 606) && pc_issit(sd)) 3125 3132 return 0; 3126 3133 3127 3134 //added item_noequip.txt items check by Maya&[Lupus] 3128 3135 if ( … … 3146 3153 )) 3147 3154 return 0; 3148 3155 3149 3156 //Not usable by upper class. [Skotlex] 3150 3157 if(!( … … 3330 3337 if (idx < 0 || idx >= MAX_INVENTORY) //Invalid index check [Skotlex] 3331 3338 return 1; 3332 3339 3333 3340 item_data = &sd->status.inventory[idx]; 3334 3341 … … 3370 3377 if (idx < 0 || idx >= MAX_CART) //Invalid index check [Skotlex] 3371 3378 return 1; 3372 3379 3373 3380 item_data=&sd->status.cart[idx]; 3374 3381 … … 3422 3429 if(md->state.steal_flag == UCHAR_MAX || md->sc.opt1) //already stolen from / status change check 3423 3430 return 0; 3424 3431 3425 3432 sd_status= status_get_status_data(&sd->bl); 3426 3433 md_status= status_get_status_data(bl); … … 3439 3446 rate = (sd_status->dex - md_status->dex)/2 + lv*6 + 4; 3440 3447 rate += sd->add_steal_rate; 3441 3448 3442 3449 if( rate < 1 ) 3443 3450 return 0; … … 3465 3472 return 0; 3466 3473 } 3467 3474 3468 3475 if(battle_config.show_steal_in_same_party) 3469 3476 party_foreachsamemap(pc_show_steal,sd,AREA_SIZE,sd,tmp_item.nameid); … … 3474 3481 log_pick_pc(sd, "P", itemid, 1, NULL); 3475 3482 } 3476 3483 3477 3484 //A Rare Steal Global Announce by Lupus 3478 3485 if(md->db->dropitem[i].p<=battle_config.rare_drop_announce) { … … 3605 3612 //Tag player for rewarping after map-loading is done. [Skotlex] 3606 3613 sd->state.rewarp = 1; 3607 3614 3608 3615 sd->mapindex = mapindex; 3609 3616 sd->bl.m = m; … … 3763 3770 if(!sd->sc.count) 3764 3771 return 0; 3765 3772 3766 3773 for (i = 0; i < ARRAYLENGTH(scw_list); i++) 3767 3774 { // Skills requiring specific weapon types … … 3770 3777 status_change_end(&sd->bl,scw_list[i],-1); 3771 3778 } 3772 3779 3773 3780 if(sd->sc.data[SC_SPURT] && sd->status.weapon) 3774 3781 // Spurt requires bare hands (feet, in fact xD) 3775 3782 status_change_end(&sd->bl,SC_SPURT,-1); 3776 3783 3777 3784 if(sd->status.shield <= 0) { // Skills requiring a shield 3778 3785 for (i = 0; i < ARRAYLENGTH(scs_list); i++) … … 3862 3869 class_ |= MAPID_THIEF; 3863 3870 break; 3864 3871 3865 3872 case JOB_STAR_GLADIATOR: 3866 3873 case JOB_STAR_GLADIATOR2: 3867 3874 class_ |= JOBL_2_1; 3868 3875 class_ |= MAPID_TAEKWON; 3869 break; 3876 break; 3870 3877 case JOB_SOUL_LINKER: 3871 3878 class_ |= JOBL_2_2; … … 3891 3898 class_ = MAPID_SUMMER; 3892 3899 break; 3900 <<<<<<< .mine 3901 //Possible to be in the wrong spot? 3902 case JOB_NECROMANCER: // Necromancer [Brain] 3903 class_ |= JOBL_2_1; 3904 class_ |= MAPID_ADEPT; 3905 ======= 3893 3906 //Custom Jobs (blackmagic) 3894 3907 + case JOB_NECROMANCER: // Necromancer [Brain] … … 3900 3913 case JOB_ADEPT: // Adept [Brain] 3901 3914 class_ |= MAPID_ADEPT; 3902 break; 3903 //Custom Job End 3915 >>>>>>> .r18 3916 break; 3917 case JOB_WARLOCK: // Warlock [Brain] 3918 class_ |= JOBL_2_2; 3919 case JOB_ADEPT: // Adept [Brain] 3920 class_ |= MAPID_ADEPT; 3921 break; 3904 3922 default: 3905 3923 return -1; … … 3925 3943 case MAPID_XMAS: return JOB_XMAS; 3926 3944 case MAPID_SUMMER: return JOB_SUMMER; 3927 //Custom Jobs (blackmagic)3928 3945 case MAPID_ADEPT: return JOB_ADEPT; // Adept [Brain] 3929 //Custom Job End3930 3931 3946 //2_1 classes 3932 3947 case MAPID_SUPER_NOVICE: return JOB_SUPER_NOVICE; … … 3938 3953 case MAPID_ASSASSIN: return JOB_ASSASSIN; 3939 3954 case MAPID_STAR_GLADIATOR: return JOB_STAR_GLADIATOR; 3940 //Custom Jobs (blackmagic)3941 3955 case MAPID_NECROMANCER: return JOB_NECROMANCER; // Necromancer [Brain] 3942 //Custom Job End3943 3944 3956 //2_2 classes 3945 3957 case MAPID_CRUSADER: return JOB_CRUSADER; … … 3950 3962 case MAPID_ROGUE: return JOB_ROGUE; 3951 3963 case MAPID_SOUL_LINKER: return JOB_SOUL_LINKER; 3952 //Custom Jobs (blackmagic)3953 3964 case MAPID_WARLOCK: return JOB_WARLOCK; // Warlock [Brain] 3954 //Custom Job End3955 3956 3965 //1-1: advanced 3957 3966 case MAPID_NOVICE_HIGH: return JOB_NOVICE_HIGH; … … 4018 4027 case JOB_THIEF: 4019 4028 return msg_txt(550 - JOB_NOVICE+class_); 4020 4029 4021 4030 case JOB_KNIGHT: 4022 4031 case JOB_PRIEST: … … 4026 4035 case JOB_ASSASSIN: 4027 4036 return msg_txt(557 - JOB_KNIGHT+class_); 4028 4037 4029 4038 case JOB_KNIGHT2: 4030 4039 return msg_txt(557); 4031 4040 4032 4041 case JOB_CRUSADER: 4033 4042 case JOB_MONK: … … 4038 4047 case JOB_DANCER: 4039 4048 return msg_txt(563 - JOB_CRUSADER+class_); 4040 4049 4041 4050 case JOB_CRUSADER2: 4042 4051 return msg_txt(563); 4043 4052 4044 4053 case JOB_WEDDING: 4045 4054 case JOB_SUPER_NOVICE: … … 4067 4076 case JOB_ASSASSIN_CROSS: 4068 4077 return msg_txt(582 - JOB_LORD_KNIGHT+class_); 4069 4078 4070 4079 case JOB_LORD_KNIGHT2: 4071 4080 return msg_txt(582); 4072 4081 4073 4082 case JOB_PALADIN: 4074 4083 case JOB_CHAMPION: … … 4079 4088 case JOB_GYPSY: 4080 4089 return msg_txt(588 - JOB_PALADIN + class_); 4081 4090 4082 4091 case JOB_PALADIN2: 4083 4092 return msg_txt(588); … … 4091 4100 case JOB_BABY_THIEF: 4092 4101 return msg_txt(595 - JOB_BABY + class_); 4093 4102 4094 4103 case JOB_BABY_KNIGHT: 4095 4104 case JOB_BABY_PRIEST: … … 4099 4108 case JOB_BABY_ASSASSIN: 4100 4109 return msg_txt(602 - JOB_BABY_KNIGHT + class_); 4101 4110 4102 4111 case JOB_BABY_KNIGHT2: 4103 4112 return msg_txt(602); 4104 4113 4105 4114 case JOB_BABY_CRUSADER: 4106 4115 case JOB_BABY_MONK: … … 4111 4120 case JOB_BABY_DANCER: 4112 4121 return msg_txt(608 - JOB_BABY_CRUSADER +class_); 4113 4122 4114 4123 case JOB_BABY_CRUSADER2: 4115 4124 return msg_txt(608); 4116 4125 4117 4126 case JOB_SUPER_BABY: 4118 4127 return msg_txt(615); 4119 4128 4120 4129 case JOB_TAEKWON: 4121 4130 return msg_txt(616); … … 4125 4134 case JOB_SOUL_LINKER: 4126 4135 return msg_txt(618); 4127 4136 4128 4137 case JOB_GUNSLINGER: 4129 4138 return msg_txt(619); 4130 4139 case JOB_NINJA: 4131 4140 return msg_txt(620); 4141 <<<<<<< .mine 4142 case JOB_ADEPT: // Adept [Brain] 4143 return msg_txt(1000); 4144 case JOB_NECROMANCER: // Necromancer [Brain] 4145 return msg_txt(1001); 4146 case JOB_WARLOCK: // Warlock [Flavio] 4147 ======= 4132 4148 //Custom Jobs (blackmagic) 4133 4149 case JOB_ADEPT: // Adept [Brain] … … 4136 4152 return msg_txt(1001); 4137 4153 case JOB_WARLOCK: // Warlock [Flavio] 4154 >>>>>>> .r18 4138 4155 return msg_txt(1002); 4139 //Custom Job End 4140 4156 4141 4157 default: 4142 4158 return msg_txt(650); … … 4232 4248 if (sd->status.status_point > USHRT_MAX - next) 4233 4249 sd->status.status_point = USHRT_MAX; 4234 else 4250 else 4235 4251 sd->status.status_point += next; 4236 4252 … … 4239 4255 if (battle_config.pet_lv_rate && sd->pd) //<Skotlex> update pet's level 4240 4256 status_calc_pet(sd->pd,0); 4241 4257 4242 4258 clif_updatestatus(sd,SP_STATUSPOINT); 4243 4259 clif_updatestatus(sd,SP_BASELEVEL); … … 4309 4325 4310 4326 if (sd->expaddrace[status->race]) 4311 bonus += sd->expaddrace[status->race]; 4327 bonus += sd->expaddrace[status->race]; 4312 4328 bonus += sd->expaddrace[status->mode&MD_BOSS?RC_BOSS:RC_NONBOSS]; 4313 4314 if (battle_config.pk_mode && 4329 4330 if (battle_config.pk_mode && 4315 4331 (int)(status_get_lv(src) - sd->status.base_level) >= 20) 4316 bonus += 15; // pk_mode additional exp if monster >20 levels [Valaris] 4332 bonus += 15; // pk_mode additional exp if monster >20 levels [Valaris] 4317 4333 4318 4334 if (sd->sc.data[SC_EXPBOOST]) … … 4321 4337 if (!bonus) 4322 4338 return; 4323 4339 4324 4340 *base_exp += (unsigned int) cap_value((double)*base_exp * bonus/100., 1, UINT_MAX); 4325 4341 *job_exp += (unsigned int) cap_value((double)*job_exp * bonus/100., 1, UINT_MAX); … … 4350 4366 nextb = pc_nextbaseexp(sd); 4351 4367 nextj = pc_nextjobexp(sd); 4352 4368 4353 4369 if(sd->state.showexp || battle_config.max_exp_gain_rate){ 4354 4370 if (nextb > 0) … … 4372 4388 } 4373 4389 } 4374 4390 4375 4391 //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] 4376 4392 if (base_exp) { … … 4538 4554 4539 4555 max = pc_maxparameter(sd); 4540 4556 4541 4557 switch(type){ 4542 4558 case SP_STR: sd->status.str = cap_value(sd->status.str + val, 1, max); break; … … 4638 4654 } 4639 4655 status_calc_pc(sd,0); 4640 //Required because if you could level up all skills previously, 4656 //Required because if you could level up all skills previously, 4641 4657 //the update will not be sent as only the lv variable changes. 4642 4658 clif_skillinfoblock(sd); … … 4735 4751 { 4736 4752 nullpo_retr(0, sd); 4737 4753 4738 4754 if (battle_config.use_statpoint_table) 4739 4755 { // New statpoint table used here - Dexity … … 4748 4764 if (sd->class_&JOBL_UPPER) 4749 4765 stat+=52; // extra 52+48=100 stat points 4750 4766 4751 4767 if (stat > USHRT_MAX) 4752 4768 sd->status.status_point = USHRT_MAX; … … 4788 4804 clif_updatestatus(sd,SP_UDEX); 4789 4805 clif_updatestatus(sd,SP_ULUK); // End Addition 4790 4806 4791 4807 clif_updatestatus(sd,SP_STATUSPOINT); 4792 4808 status_calc_pc(sd,0); … … 4823 4839 merc_hom_vaporize(sd, 0); 4824 4840 } 4825 4841 4826 4842 for (i = 1; i < MAX_SKILL; i++) { 4827 4843 lv= sd->status.skill[i].lv; … … 4852 4868 } 4853 4869 } 4854 4870 4855 4871 if (flag&2 || !skill_point) return skill_point; 4856 4872 … … 4958 4974 if(!src || src == &sd->bl) 4959 4975 return; 4960 4976 4961 4977 if(sd->status.pet_id > 0 && sd->pd && battle_config.pet_damage_support) 4962 4978 pet_target_check(sd,src,1); … … 4970 4986 int i=0,j=0,k=0; 4971 4987 unsigned int tick = gettick(); 4972 4988 4973 4989 if(sd->vender_id) 4974 4990 vending_closevending(sd); … … 5065 5081 // karma going down = more 'good' / more honourable. 5066 5082 // The Karma System way... 5067 5083 5068 5084 if (sd->status.karma > ssd->status.karma) { // If player killed was more evil 5069 5085 sd->status.karma--; … … 5072 5088 else if (sd->status.karma < ssd->status.karma) // If player killed was more good 5073 5089 ssd->status.karma++; 5074 5090 5075 5091 5076 5092 // or the PK System way... 5077 5093 5078 5094 if (sd->status.karma > 0) // player killed is dishonourable? 5079 5095 ssd->status.karma--; // honour points earned 5080 5096 sd->status.karma++; // honour points lost 5081 5097 5082 5098 // To-do: Receive exp on certain occasions 5083 5099 #endif … … 5326 5342 stat += (sd->status.base_level + i + 14) / 5 ; 5327 5343 if (sd->status.status_point > USHRT_MAX - stat) 5328 5344 5329 5345 sd->status.status_point = USHRT_MAX; 5330 5346 else … … 5528 5544 status_percent_damage(NULL, &sd->bl, hp, 0, hp==-100); 5529 5545 } 5530 5546 5531 5547 if(sp) { 5532 5548 if(sp > 0) … … 5560 5576 switch (upper) { 5561 5577 case 1: 5562 b_class|= JOBL_UPPER; 5578 b_class|= JOBL_UPPER; 5563 5579 break; 5564 5580 case 2: … … 5567 5583 } 5568 5584 //This will automatically adjust bard/dancer classes to the correct gender 5569 //That is, if you try to jobchange into dancer, it will turn you to bard. 5585 //That is, if you try to jobchange into dancer, it will turn you to bard. 5570 5586 job = pc_mapid2jobid(b_class, sd->status.sex); 5571 5587 if (job == -1) 5572 5588 return 1; 5573 5589 5574 5590 if ((unsigned short)b_class == sd->class_) 5575 5591 return 1; //Nothing to change. … … 5599 5615 } 5600 5616 } 5601 5617 5602 5618 sd->status.class_ = job; 5603 5619 fame_flag = pc_famerank(sd->status.char_id,sd->class_&MAPID_UPPERMASK); … … 5615 5631 } 5616 5632 5617 //Change look, if disguised, you need to undisguise 5633 //Change look, if disguised, you need to undisguise 5618 5634 //to correctly calculate new job sprite without 5619 5635 if (sd->disguise) … … 5643 5659 if(merc_is_hom_active(sd->hd) && !pc_checkskill(sd, AM_CALLHOMUN)) 5644 5660 merc_hom_vaporize(sd, 0); 5645 5661 5646 5662 if(sd->status.manner < 0) 5647 5663 clif_changestatus(&sd->bl,SP_MANNER,sd->status.manner); … … 5802 5818 else if (!(type&OPTION_FLYING) && p_type&OPTION_FLYING) 5803 5819 new_look = -1; 5804 5820 5805 5821 if (type&OPTION_WEDDING && !(p_type&OPTION_WEDDING)) 5806 5822 new_look = JOB_WEDDING; … … 6036 6052 struct global_reg *sd_reg; 6037 6053 int i,max; 6038 6054 6039 6055 nullpo_retr(0, sd); 6040 6056 switch (type) { … … 6113 6129 return 1; 6114 6130 } 6115 6131 6116 6132 // delete reg 6117 6133 if (val == 0) { … … 6185 6201 return 0; 6186 6202 } 6187 6203 6188 6204 // delete reg 6189 6205 if (!val || strcmp(val,"")==0) … … 6379 6395 if(pos == EQP_ACC) { //Accesories should only go in one of the two, 6380 6396 pos = req_pos&EQP_ACC; 6381 if (pos == EQP_ACC) //User specified both slots.. 6397 if (pos == EQP_ACC) //User specified both slots.. 6382 6398 pos = sd->equip_index[EQI_ACC_R] >= 0 ? EQP_ACC_L : EQP_ACC_R; 6383 6399 } … … 6564 6580 clif_unequipitemack(sd,n,sd->status.inventory[n].equip,1); 6565 6581 6566 if((sd->status.inventory[n].equip & EQP_ARMS) && 6582 if((sd->status.inventory[n].equip & EQP_ARMS) && 6567 6583 sd->weapontype1 == 0 && sd->weapontype2 == 0 && (!sd->sc.data[SC_SEVENWIND] || sd->sc.data[SC_ASPERSIO])) //Check for seven wind (but not level seven!) 6568 6584 skill_enchant_elemental_end(&sd->bl,-1); … … 6620 6636 if (sd->vender_id) //Avoid reorganizing items when we are vending, as that leads to exploits (pointed out by End of Exam) 6621 6637 return 0; 6622 6638 6623 6639 // ió«lß 6624 6640 for(i=j=0;i<MAX_INVENTORY;i++){ … … 6865 6881 hp = sd->battle_status.hp-1; //Script drains cannot kill you. 6866 6882 } 6867 6883 6868 6884 if (sd->sp_loss.value) { 6869 6885 sd->sp_loss.tick += diff_tick; … … 6894 6910 } 6895 6911 } 6896 6912 6897 6913 if (sd->sp_regen.value) { 6898 6914 sd->sp_regen.tick += diff_tick; … … 7000 7016 if (data == 0 && battle_config.day_duration <= 0) // if we want a day 7001 7017 return 0; 7002 7018 7003 7019 if (!night_flag) 7004 7020 return 0; //Already day. 7005 7021 7006 7022 night_flag = 0; // 0=day, 1=night [Yor] 7007 7023 map_foreachpc(pc_daynight_timer_sub); … … 7021 7037 if (data == 0 && battle_config.night_duration <= 0) // if we want a night 7022 7038 return 0; 7023 7039 7024 7040 if (night_flag) 7025 7041 return 0; //Already nigth. … … 7050 7066 time_t timer; 7051 7067 struct tm *t; 7052 7068 7053 7069 time(&timer); 7054 7070 t = localtime(&timer); 7055 7056 pc_setglobalreg(sd, "PC_LAST_DUEL_TIME", t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min); 7071 7072 pc_setglobalreg(sd, "PC_LAST_DUEL_TIME", t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min); 7057 7073 return; 7058 7074 } … … 7063 7079 time_t timer; 7064 7080 struct tm *t; 7065 7081 7066 7082 time(&timer); 7067 7083 t = localtime(&timer); 7068 7084 7069 7085 diff = t->tm_mday*24*60 + t->tm_hour*60 + t->tm_min - pc_readglobalreg(sd, "PC_LAST_DUEL_TIME"); 7070 7086 7071 7087 return !(diff >= 0 && diff < battle_config.duel_time_interval); 7072 7088 } … … 7078 7094 7079 7095 if (sd->duel_group != ssd->duel_group) return 0; 7080 7096 7081 7097 sprintf(output, " %d. %s", ++(*p), sd->status.name); 7082 7098 clif_disp_onlyself(ssd, output, strlen(output)); … … 7110 7126 int i=1; 7111 7127 char output[256]; 7112 7128 7113 7129 while(duel_list[i].members_count > 0 && i < MAX_DUEL) i++; 7114 7130 if(i == MAX_DUEL) return 0; 7115 7131 7116 7132 duel_count++; 7117 7133 sd->duel_group = i; … … 7119 7135 duel_list[i].invites_count = 0; 7120 7136 duel_list[i].max_players_limit = maxpl; 7121 7137 7122 7138 strcpy(output, msg_txt(372)); // " -- Duel has been created (@invite/@leave) --" 7123 7139 clif_disp_onlyself(sd, output, strlen(output)); 7124 7140 7125 7141 clif_set0199(sd, 1); 7126 7142 //clif_misceffect2(&sd->bl, 159); … … 7138 7154 target_sd->duel_invite = did; 7139 7155 duel_list[did].invites_count++; 7140 7156 7141 7157 // "Blue -- Player %s invites you to PVP duel (@accept/@reject) --" 7142 7158 sprintf(output, msg_txt(374), sd->status.name); … … 7156 7172 { 7157 7173 char output[256]; 7158 7174 7159 7175 // " <- Player %s has left duel --" 7160 7176 sprintf(output, msg_txt(375), sd->status.name); 7161 7177 clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); 7162 7178 7163 7179 duel_list[did].members_count--; 7164 7180 7165 7181 if(duel_list[did].members_count == 0) { 7166 map_foreachpc(duel_leave_sub, did); 7182 map_foreachpc(duel_leave_sub, did); 7167 7183 duel_count--; 7168 7184 } 7169 7185 7170 7186 sd->duel_group = 0; 7171 7187 duel_savetime(sd); … … 7177 7193 { 7178 7194 char output[256]; 7179 7195 7180 7196 duel_list[did].members_count++; 7181 7197 sd->duel_group = sd->duel_invite; 7182 7198 duel_list[did].invites_count--; 7183 7199 sd->duel_invite = 0; 7184 7200 7185 7201 // " -> Player %s has accepted duel --" 7186 7202 sprintf(output, msg_txt(376), sd->status.name); … … 7195 7211 { 7196 7212 char output[256]; 7197 7213 7198 7214 // " -- Player %s has rejected duel --" 7199 7215 sprintf(output, msg_txt(377), sd->status.name); 7200 7216 clif_disp_message(&sd->bl, output, strlen(output), DUEL_WOS); 7201 7217 7202 7218 duel_list[did].invites_count--; 7203 7219 sd->duel_invite = 0; … … 7297 7313 if (pc_split_str(line,split,4) < 4) 7298 7314 continue; 7299 7315 7300 7316 job_count = pc_split_atoi(split[1],jobs,':',CLASS_COUNT); 7301 7317 if (job_count < 1) … … 7316 7332 maxlv = MAX_LEVEL; 7317 7333 } 7318 7334 7319 7335 job = jobs[0] = pc_class2idx(job_id); 7320 7336 //We send one less and then one more because the last entry in the exp array should hold 0. … … 7477 7493 if (i > MAX_LEVEL) 7478 7494 break; 7479 statp[i]=j; 7495 statp[i]=j; 7480 7496 i++; 7481 7497 } … … 7486 7502 for (; i <= MAX_LEVEL; i++) { 7487 7503 j += (i+15)/5; 7488 statp[i] = j; 7504 statp[i] = j; 7489 7505 } 7490 7506 … … 7518 7534 else 7519 7535 ShowWarning("In function pc_read_motd() -> File '"CL_WHITE"%s"CL_RESET"' not found.\n", motd_txt); 7520 7536 7521 7537 return 0; 7522 7538 }