📄 pc.c
字号:
else if( (sd->weapontype1 == 1 && sd->weapontype2 == 6) ||
(sd->weapontype1 == 6 && sd->weapontype2 == 1) ) // 抁寱 - 晙
sd->status.weapon = 0x15;
else if( (sd->weapontype1 == 2 && sd->weapontype2 == 6) ||
(sd->weapontype1 == 6 && sd->weapontype2 == 2) ) // 扨庤寱 - 晙
sd->status.weapon = 0x16;
else
sd->status.weapon = sd->weapontype1;
return 0;
}
int pc_setequipindex(struct map_session_data *sd)
{
int i,j;
for(i=0;i<11;i++)
sd->equip_index[i] = -1;
for(i=0;i<MAX_INVENTORY;i++) {
if(sd->status.inventory[i].nameid <= 0)
continue;
if(sd->status.inventory[i].equip) {
for(j=0;j<11;j++)
if(sd->status.inventory[i].equip & equip_pos[j])
sd->equip_index[j] = i;
if(sd->status.inventory[i].equip & 0x0002) {
if(sd->inventory_data[i])
sd->weapontype1 = sd->inventory_data[i]->look;
else
sd->weapontype1 = 0;
}
if(sd->status.inventory[i].equip & 0x0020) {
if(sd->inventory_data[i]) {
if(sd->inventory_data[i]->type == 4) {
if(sd->status.inventory[i].equip == 0x0020)
sd->weapontype2 = sd->inventory_data[i]->look;
else
sd->weapontype2 = 0;
}
else
sd->weapontype2 = 0;
}
else
sd->weapontype2 = 0;
}
}
}
pc_calcweapontype(sd);
return 0;
}
int pc_isequip(struct map_session_data *sd,int n)
{
struct item_data *item = sd->inventory_data[n];
struct status_change *sc_data = battle_get_sc_data(&sd->bl);
if( battle_config.gm_allequip>0 && pc_isGM(sd)>=battle_config.gm_allequip )
return 1;
if(item == NULL)
return 0;
if(item->sex != 2 && sd->status.sex != item->sex)
return 0;
if(item->elv > 0 && sd->status.base_level < item->elv)
return 0;
if(((1<<sd->status.class)&item->class) == 0)
return 0;
if(map[sd->bl.m].flag.pvp && (item->flag.no_equip==1 || item->flag.no_equip==3))
return 0;
if(map[sd->bl.m].flag.gvg && (item->flag.no_equip==2 || item->flag.no_equip==3))
return 0;
if(item->equip & 0x0002 && sc_data[SC_STRIPWEAPON].timer != -1)
return 0;
if(item->equip & 0x0020 && sc_data[SC_STRIPSHIELD].timer != -1)
return 0;
if(item->equip & 0x0010 && sc_data[SC_STRIPARMOR].timer != -1)
return 0;
if(item->equip & 0x0100 && sc_data[SC_STRIPHELM].timer != -1)
return 0;
return 1;
}
/*==========================================
* session id偵栤戣柍偟
* char嶪偐傜憲傜傟偰偒偨僗僥乕僞僗傪愝掕
*------------------------------------------
*/
int pc_authok(int id,struct mmo_charstatus *st)
{
struct map_session_data *sd;
struct party *p;
struct guild *g;
int i;
unsigned long tick = gettick();
sd = map_id2sd(id);
if(sd==NULL)
return 1;
if(sd->new_fd){
// 2廳login忬懺偩偭偨偺偱丄椉曽棊偡
clif_authfail_fd(sd->fd,2); // same id
clif_authfail_fd(sd->new_fd,2); // same id
return 1;
}
memcpy(&sd->status,st,sizeof(*st));
if(sd->status.sex != sd->sex){
clif_authfail_fd(sd->fd,0);
return 1;
}
memset(&sd->state,0,sizeof(sd->state));
// 婎杮揑側弶婜壔
sd->state.connect_new = 1;
sd->bl.prev = sd->bl.next = NULL;
sd->weapontype1 = sd->weapontype2 = 0;
sd->view_class = sd->status.class;
sd->speed = DEFAULT_WALK_SPEED;
sd->state.dead_sit=0;
sd->dir=0;
sd->head_dir=0;
sd->state.auth=1;
sd->walktimer=-1;
sd->attacktimer=-1;
sd->skilltimer=-1;
sd->skillitem=-1;
sd->skillitemlv=-1;
sd->invincible_timer=-1;
sd->deal_locked =0;
sd->trade_partner=0;
sd->inchealhptick = 0;
sd->inchealsptick = 0;
sd->hp_sub = 0;
sd->sp_sub = 0;
sd->inchealspirittick = 0;
sd->canact_tick = tick;
sd->canmove_tick = tick;
sd->attackabletime = tick;
sd->spiritball = 0;
for(i=0;i<MAX_SKILL_LEVEL;i++)
sd->spirit_timer[i] = -1;
for(i=0;i<MAX_SKILLTIMERSKILL;i++)
sd->skilltimerskill[i].timer = -1;
memset(&sd->dev,0,sizeof(struct square));
for(i=0;i<5;i++){
sd->dev.val1[i] = 0;
sd->dev.val2[i] = 0;
}
// 傾僇僂儞僩曄悢偺憲怣梫媮
intif_request_accountreg(sd);
// 傾僀僥儉僠僃僢僋
pc_setinventorydata(sd);
pc_checkitem(sd);
// pet
sd->petDB = NULL;
sd->pd = NULL;
sd->pet_hungry_timer = -1;
memset(&sd->pet,0,sizeof(struct s_pet));
// 僗僥乕僞僗堎忢偺弶婜壔
for(i=0;i<MAX_STATUSCHANGE;i++) {
sd->sc_data[i].timer=-1;
sd->sc_data[i].val1 = sd->sc_data[i].val2 = sd->sc_data[i].val3 = sd->sc_data[i].val4 = 0;
}
sd->sc_count=0;
sd->status.option&=OPTION_MASK;
// 僗僉儖儐僯僢僩娭學偺弶婜壔
memset(sd->skillunit,0,sizeof(sd->skillunit));
memset(sd->skillunittick,0,sizeof(sd->skillunittick));
// 僷乕僥傿乕娭學偺弶婜壔
sd->party_sended=0;
sd->party_invite=0;
sd->party_x=-1;
sd->party_y=-1;
sd->party_hp=-1;
// 僊儖僪娭學偺弶婜壔
sd->guild_sended=0;
sd->guild_invite=0;
sd->guild_alliance=0;
// 僀儀儞僩娭學偺弶婜壔
memset(sd->eventqueue,0,sizeof(sd->eventqueue));
for(i=0;i<MAX_EVENTTIMER;i++)
sd->eventtimer[i] = -1;
// 埵抲偺愝掕
pc_setpos(sd,sd->status.last_point.map ,
sd->status.last_point.x , sd->status.last_point.y, 0);
// pet
if(sd->status.pet_id > 0)
intif_request_petdata(sd->status.account_id,sd->status.char_id,sd->status.pet_id);
// 僷乕僥傿丄僊儖僪僨乕僞偺梫媮
if( sd->status.party_id>0 && (p=party_search(sd->status.party_id))==NULL)
party_request_info(sd->status.party_id);
if( sd->status.guild_id>0 && (g=guild_search(sd->status.guild_id))==NULL)
guild_request_info(sd->status.guild_id);
// pvp偺愝掕
sd->pvp_rank=0;
sd->pvp_point=0;
sd->pvp_timer=-1;
// 捠抦
clif_authok(sd);
map_addnickdb(sd);
// 僗僥乕僞僗弶婜寁嶼側偳
pc_calcstatus(sd,1);
// Message of the Day偺憲怣
{
char buf[256];
FILE *fp;
if( (fp = fopen(motd_txt, "r"))!=NULL){
while (fgets(buf, 250, fp) != NULL){
int i;
for( i=0; buf[i]; i++){
if( buf[i]=='\r' || buf[i]=='\n'){
buf[i]=0;
break;
}
}
clif_displaymessage(sd->fd,buf);
}
fclose(fp);
}
}
return 0;
}
/*==========================================
* session id偵栤戣偁傝側偺偱屻巒枛
*------------------------------------------
*/
int pc_authfail(int id)
{
struct map_session_data *sd;
sd = map_id2sd(id);
if(sd==NULL)
return 1;
if(sd->new_fd){
// 2廳login忬懺偩偭偨偺偱丄怴偟偄愙懕偺傒棊偡
clif_authfail_fd(sd->new_fd,0);
sd->new_fd=0;
return 0;
}
clif_authfail_fd(sd->fd,0);
return 0;
}
static int pc_calc_skillpoint(struct map_session_data* sd)
{
int i,skill,skill_point=0;
for(i=1;i<MAX_SKILL;i++){
if( (skill = pc_checkskill(sd,i)) > 0) {
if(!(skill_get_inf2(i)&0x01) || battle_config.quest_skill_learn) {
if(!sd->status.skill[i].flag)
skill_point += skill;
else if(sd->status.skill[i].flag > 2 && sd->status.skill[i].flag != 13) {
skill_point += (sd->status.skill[i].flag - 2);
}
}
}
}
return skill_point;
}
/*==========================================
* 妎偊傜傟傞僗僉儖偺寁嶼
*------------------------------------------
*/
int pc_calc_skilltree(struct map_session_data *sd)
{
int i,id=0,flag;
int c=sd->status.class;
if(battle_config.skillup_limit && c >= 0 && c < 23) {
int skill_point = pc_calc_skillpoint(sd);
if(skill_point < 9)
c = 0;
else if(sd->status.skill_point >= sd->status.job_level && skill_point < 58 && c > 6) {
switch(c) {
case 7:
case 14:
c = 1;
break;
case 8:
case 15:
c = 4;
break;
case 9:
case 16:
c = 2;
break;
case 10:
case 18:
c = 5;
break;
case 11:
case 19:
case 20:
c = 3;
break;
case 12:
case 17:
c = 6;
break;
}
}
}
for(i=0;i<MAX_SKILL;i++){
if (sd->status.skill[i].flag != 13) sd->status.skill[i].id=0;
if (sd->status.skill[i].flag && sd->status.skill[i].flag != 13){ // card僗僉儖側傜丄
sd->status.skill[i].lv=(sd->status.skill[i].flag==1)?0:sd->status.skill[i].flag-2; // 杮摉偺lv偵
sd->status.skill[i].flag=0; // flag偼0偵偟偰偍偔
}
}
if (battle_config.gm_allskill > 0 && pc_isGM(sd) >= battle_config.gm_allskill){
// 慡偰偺僗僉儖
for(i=1;i<158;i++)
sd->status.skill[i].id=i;
for(i=210;i<291;i++)
sd->status.skill[i].id=i;
for(i=304;i<MAX_SKILL;i++)
sd->status.skill[i].id=i;
}else{
// 捠忢偺寁嶼
do{
flag=0;
for(i=0;(id=skill_tree[c][i].id)>0;i++){
int j,f=1;
if(!battle_config.skillfree) {
for(j=0;j<5;j++) {
if( skill_tree[c][i].need[j].id &&
pc_checkskill(sd,skill_tree[c][i].need[j].id) < skill_tree[c][i].need[j].lv)
f=0;
}
}
if(f && sd->status.skill[id].id==0 ){
sd->status.skill[id].id=id;
flag=1;
}
}
}while(flag);
}
// if(battle_config.etc_log)
// printf("calc skill_tree\n");
return 0;
}
/*==========================================
* 廳検傾僀僐儞偺妋擣
*------------------------------------------
*/
int pc_checkweighticon(struct map_session_data *sd)
{
int flag=0;
if(sd->weight*2 >= sd->max_weight)
flag=1;
if(sd->weight*10 >= sd->max_weight*9)
flag=2;
if(flag==1){
if(sd->sc_data[SC_WEIGHT50].timer==-1)
skill_status_change_start(&sd->bl,SC_WEIGHT50,0,0,0,0,0,0);
}else{
skill_status_change_end(&sd->bl,SC_WEIGHT50,-1);
}
if(flag==2){
if(sd->sc_data[SC_WEIGHT90].timer==-1)
skill_status_change_start(&sd->bl,SC_WEIGHT90,0,0,0,0,0,0);
}else{
skill_status_change_end(&sd->bl,SC_WEIGHT90,-1);
}
return 0;
}
/*==========================================
* 僷儔儊乕僞寁嶼
* first==0偺帪丄寁嶼懳徾偺僷儔儊乕僞偑屇傃弌偟慜偐傜
* 曄 壔偟偨応崌帺摦偱send偡傞偑丄
* 擻摦揑偵曄壔偝偣偨僷儔儊乕僞偼帺慜偱send偡傞傛偆偵
*------------------------------------------
*/
int pc_calcstatus(struct map_session_data* sd,int first)
{
int b_speed,b_max_hp,b_max_sp,b_hp,b_sp,b_weight,b_max_weight,b_paramb[6],b_parame[6],b_hit,b_flee;
int b_aspd,b_watk,b_def,b_watk2,b_def2,b_flee2,b_critical,b_attackrange,b_matk1,b_matk2,b_mdef,b_mdef2,b_class;
int b_base_atk;
struct skill b_skill[MAX_SKILL];
int i,bl,index;
int skill,aspd_rate,wele,wele_,def_ele,refinedef=0;
int pele=0,pdef_ele=0;
int str,dstr,dex;
b_speed = sd->speed;
b_max_hp = sd->status.max_hp;
b_max_sp = sd->status.max_sp;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -