亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? pc.c

?? 最新的仙鏡傳說服務(wù)器C語言源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include "timer.h"
#include "db.h"
#include "map.h"
#include "chrif.h"
#include "clif.h"
#include "intif.h"
#include "pc.h"
#include "npc.h"
#include "mob.h"
#include "pet.h"
#include "itemdb.h"
#include "script.h"
#include "battle.h"
#include "skill.h"
#include "party.h"
#include "guild.h"
#include "chat.h"
#include "trade.h"
#include "storage.h"
#include "vending.h"

#ifdef MEMWATCH
#include "memwatch.h"
#endif

#define PVP_CALCRANK_INTERVAL 1000	// PVP弴埵寁嶼偺娫妘

static int max_weight_base[MAX_PC_CLASS];
static int hp_coefficient[MAX_PC_CLASS];
static int hp_coefficient2[MAX_PC_CLASS];
static int hp_sigma_val[MAX_PC_CLASS][MAX_LEVEL];
static int sp_coefficient[MAX_PC_CLASS];
static int aspd_base[MAX_PC_CLASS][20];
static char job_bonus[MAX_PC_CLASS][MAX_LEVEL];
static int exp_table[8][MAX_LEVEL];
static struct {
	int id;
	int max;
	struct {
		short id,lv;
	} need[6];
} skill_tree[MAX_PC_CLASS][100];


static int atkmods[3][20];	// 晲婍ATK僒僀僘廋惓(size_fix.txt)
static int refinebonus[5][3];	// 惛楤儃乕僫僗僥乕僽儖(refine_db.txt)
static int percentrefinery[5][10];	// 惛楤惉岟棪(refine_db.txt)

static int dirx[8]={0,-1,-1,-1,0,1,1,1};
static int diry[8]={1,1,0,-1,-1,-1,0,1};

static unsigned int equip_pos[11]={0x0080,0x0008,0x0040,0x0004,0x0001,0x0200,0x0100,0x0010,0x0020,0x0002,0x8000};

static char GM_account_filename[1024] = "conf/GM_account.txt";
static struct dbt *gm_account_db;

void pc_set_gm_account_fname(char *str)
{
	strcpy(GM_account_filename,str);
}

int pc_isGM(struct map_session_data *sd)
{
	struct gm_account *p;
	p = numdb_search(gm_account_db,sd->status.account_id);
	if( p == NULL)
		return 0;
	return p->level;
}

int pc_getrefinebonus(int lv,int type)
{
	if(lv >= 0 && lv < 5 && type >= 0 && type < 3)
		return refinebonus[lv][type];
	return 0;
}

static int distance(int x0,int y0,int x1,int y1)
{
	int dx,dy;

	dx=abs(x0-x1);
	dy=abs(y0-y1);
	return dx>dy ? dx : dy;
}

static int pc_invincible_timer(int tid,unsigned int tick,int id,int data)
{
	struct map_session_data *sd;

	sd=(struct map_session_data *)map_id2sd(id);
	if(sd==NULL || sd->bl.type!=BL_PC)
		return 1;

	if(sd->invincible_timer != tid){
		if(battle_config.error_log)
			printf("invincible_timer %d != %d\n",sd->invincible_timer,tid);
		return 0;
	}
	sd->invincible_timer=-1;

	return 0;
}


int pc_setinvincibletimer(struct map_session_data *sd,int val)
{
	if(sd->invincible_timer != -1)
		delete_timer(sd->invincible_timer,pc_invincible_timer);
	sd->invincible_timer = add_timer(gettick()+val,pc_invincible_timer,sd->bl.id,0);
	return 0;
}

int pc_delinvincibletimer(struct map_session_data *sd)
{
	if(sd->invincible_timer != -1) {
		delete_timer(sd->invincible_timer,pc_invincible_timer);
		sd->invincible_timer = -1;
	}
	return 0;
}

static int pc_spiritball_timer(int tid,unsigned int tick,int id,int data)
{
	struct map_session_data *sd;
	int i;

	sd=(struct map_session_data *)map_id2sd(id);
	if(sd==NULL || sd->bl.type!=BL_PC)
		return 1;

	if(sd->spirit_timer[0] != tid){
		if(battle_config.error_log)
			printf("spirit_timer %d != %d\n",sd->spirit_timer[0],tid);
		return 0;
	}
	sd->spirit_timer[0]=-1;
	for(i=1;i<sd->spiritball;i++) {
		sd->spirit_timer[i-1] = sd->spirit_timer[i];
		sd->spirit_timer[i] = -1;
	}
	sd->spiritball--;
	if(sd->spiritball < 0)
		sd->spiritball = 0;
	clif_spiritball(sd);

	return 0;
}

int pc_addspiritball(struct map_session_data *sd,int interval,int max)
{
	int i;

	if(max > MAX_SKILL_LEVEL)
		max = MAX_SKILL_LEVEL;
	if(sd->spiritball < 0)
		sd->spiritball = 0;

	if(sd->spiritball >= max) {
		if(sd->spirit_timer[0] != -1) {
			delete_timer(sd->spirit_timer[0],pc_spiritball_timer);
			sd->spirit_timer[0] = -1;
		}
		for(i=1;i<max;i++) {
			sd->spirit_timer[i-1] = sd->spirit_timer[i];
			sd->spirit_timer[i] = -1;
		}
	}
	else
		sd->spiritball++;

	sd->spirit_timer[sd->spiritball-1] = add_timer(gettick()+interval,pc_spiritball_timer,sd->bl.id,0);
	clif_spiritball(sd);

	return 0;
}


int pc_delspiritball(struct map_session_data *sd,int count,int type)
{
	int i;

	if(sd->spiritball <= 0) {
		sd->spiritball = 0;
		return 0;
	}

	if(count > sd->spiritball)
		count = sd->spiritball;
	sd->spiritball -= count;
	if(count > MAX_SKILL_LEVEL)
		count = MAX_SKILL_LEVEL;

	for(i=0;i<count;i++) {
		if(sd->spirit_timer[i] != -1) {
			delete_timer(sd->spirit_timer[i],pc_spiritball_timer);
			sd->spirit_timer[i] = -1;
		}
	}
	for(i=count;i<MAX_SKILL_LEVEL;i++) {
		sd->spirit_timer[i-count] = sd->spirit_timer[i];
		sd->spirit_timer[i] = -1;
	}

	if(!type)
		clif_spiritball(sd);

	return 0;
}

int pc_setrestartvalue(struct map_session_data *sd,int type)
{
	//-----------------------
	// 巰朣偟偨
	if(sd->special_state.restart_full_recover) {	// 僆僔儕僗僇乕僪
		sd->status.hp=sd->status.max_hp;
		sd->status.sp=sd->status.max_sp;
	}
	else {
		if(sd->status.class == 0 && battle_config.restart_hp_rate < 50) {	// 僲乕價僗
			sd->status.hp=(sd->status.max_hp)/2;
		}
		else {
			if(battle_config.restart_hp_rate <= 0)
				sd->status.hp = 1;
			else {
				sd->status.hp = sd->status.max_hp * battle_config.restart_hp_rate /100;
				if(sd->status.hp <= 0)
					sd->status.hp = 1;
			}
		}
		if(battle_config.restart_sp_rate > 0) {
			int sp = sd->status.max_sp * battle_config.restart_sp_rate /100;
			if(sd->status.sp < sp)
				sd->status.sp = sp;
		}
	}
	if(type&1)
		clif_updatestatus(sd,SP_HP);
	if(type&1)
		clif_updatestatus(sd,SP_SP);

	if(type&2) {
		if(!(battle_config.death_penalty_type&1) ) {
			if(sd->status.class > 0 && !map[sd->bl.m].flag.nopenalty && !map[sd->bl.m].flag.gvg){
				if(battle_config.death_penalty_type&2 && battle_config.death_penalty_base > 0)
					sd->status.base_exp -= (int)((double)pc_nextbaseexp(sd) * (double)battle_config.death_penalty_base/10000.);
				else if(battle_config.death_penalty_base > 0) {
					if(pc_nextbaseexp(sd) > 0)
						sd->status.base_exp -= (int)((double)sd->status.base_exp * (double)battle_config.death_penalty_base/10000.);
				}
				if(sd->status.base_exp < 0)
					sd->status.base_exp = 0;
				if(type&1)
					clif_updatestatus(sd,SP_BASEEXP);

				if(battle_config.death_penalty_type&2 && battle_config.death_penalty_job > 0)
					sd->status.job_exp -= (int)((double)pc_nextjobexp(sd) * (double)battle_config.death_penalty_job/10000.);
				else if(battle_config.death_penalty_job > 0) {
					if(pc_nextjobexp(sd) > 0)
						sd->status.job_exp -= (int)((double)sd->status.job_exp * (double)battle_config.death_penalty_job/10000.);
				}
				if(sd->status.job_exp < 0)
					sd->status.job_exp = 0;
				if(type&1)
					clif_updatestatus(sd,SP_JOBEXP);
			}
		}
		if(battle_config.zeny_penalty > 0&&!map[sd->bl.m].flag.nozenypenalty) {
			int zeny = (int)((double)sd->status.zeny * (double)battle_config.zeny_penalty / 10000.);
			if(zeny < 1) zeny = 1;
			sd->status.zeny -= zeny;
			if(sd->status.zeny < 0) sd->status.zeny = 0;
			if(type&1)
				clif_updatestatus(sd,SP_ZENY);
		}
	}

	return 0;
}

/*==========================================
 * 帺暘傪儘僢僋偟偰偄傞MOB偺悢傪悢偊傞(foreachclient)
 *------------------------------------------
 */
static int pc_counttargeted_sub(struct block_list *bl,va_list ap)
{
	int id,*c;
	struct block_list *src;
	id=va_arg(ap,int);
	c=va_arg(ap,int *);
	src=va_arg(ap,struct block_list *);
	if(id == bl->id || (src && id == src->id)) return 0;
	if(bl->type == BL_PC) {
		if(((struct map_session_data *)bl)->attacktarget == id && ((struct map_session_data *)bl)->attacktimer != -1)
			(*c)++;
	}
	else if(bl->type == BL_MOB) {
		if(((struct mob_data *)bl)->target_id == id && ((struct mob_data *)bl)->timer != -1 && ((struct mob_data *)bl)->state.state == MS_ATTACK)
			(*c)++;
	}
	return 0;
}

int pc_counttargeted(struct map_session_data *sd,struct block_list *src)
{
	int c=0;
	map_foreachinarea(pc_counttargeted_sub, sd->bl.m,
		sd->bl.x-AREA_SIZE,sd->bl.y-AREA_SIZE,
		sd->bl.x+AREA_SIZE,sd->bl.y+AREA_SIZE,0,sd->bl.id,&c,src);
	return c;
}

/*==========================================
 * 儘乕僇儖僾儘僩僞僀僾愰尵 (昁梫側(cè)暔偺傒)
 *------------------------------------------
 */
static int pc_walktoxy_sub(struct map_session_data *);


/*==========================================
 * save偵昁梫側(cè)僗僥乕僞僗廋惓傪峴側(cè)偆
 *------------------------------------------
 */
int pc_makesavestatus(struct map_session_data *sd)
{
	int i;
	// 暈偺怓偼怓乆暰奞偑懡偄偺偱曐懚懳徾偵偼偟側(cè)偄
	if(!battle_config.save_clothcolor)
		sd->status.clothes_color=0;

	// 巰朣忬懺偩偭偨偺偱hp傪1丄埵抲傪僙乕僽応強(qiáng)偵曄峏
	if(pc_isdead(sd)){
		pc_setrestartvalue(sd,0);
		memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point));
	} else {
		memcpy(sd->status.last_point.map,sd->mapname,24);
		sd->status.last_point.x = sd->bl.x;
		sd->status.last_point.y = sd->bl.y;
	}

	// 僙乕僽嬛巭儅僢僾偩偭偨偺偱巜掕埵抲偵堏摦
	if(map[sd->bl.m].flag.nosave){
		struct map_data *m=&map[sd->bl.m];
		if(strcmp(m->save.map,"SavePoint")==0)
			memcpy(&sd->status.last_point,&sd->status.save_point,sizeof(sd->status.last_point));
		else
			memcpy(&sd->status.last_point,&m->save,sizeof(sd->status.last_point));
	}
	//僋儘乕儞僗僉儖偱妎偊偨僗僉儖偼徚偡
	for(i=0;i<MAX_SKILL;i++){
		if(sd->status.skill[i].flag == 13){
			sd->status.skill[i].id=0;
			sd->status.skill[i].lv=0;
			sd->status.skill[i].flag=0;
		}
	}
	return 0;
}


/*==========================================
 * 愙懕帪偺弶婜壔
 *------------------------------------------
 */
int pc_setnewpc(struct map_session_data *sd,int account_id,int char_id,int login_id1,int client_tick,int sex,int fd)
{
	sd->bl.id        = account_id;
	sd->char_id      = char_id;
	sd->login_id1    = login_id1;
	sd->client_tick  = client_tick;
	sd->sex          = sex;
	sd->state.auth   = 0;
	sd->bl.type      = BL_PC;
	sd->canact_tick = sd->canmove_tick = gettick();
	sd->state.waitingdisconnect=0;

	return 0;
}


int pc_equippoint(struct map_session_data *sd,int n)
{
	int ep = 0;
	if(sd && sd->inventory_data[n]) {
		ep = sd->inventory_data[n]->equip;
		if(sd->inventory_data[n]->look == 1 || sd->inventory_data[n]->look == 2 || sd->inventory_data[n]->look == 6) {
			if(ep == 2 && (pc_checkskill(sd,AS_LEFT) > 0 || sd->status.class == 12) )
				return 34;
		}
	}
	return ep;
}

int pc_setinventorydata(struct map_session_data *sd)
{
	int i,id;
	for(i=0;i<MAX_INVENTORY;i++) {
		id = sd->status.inventory[i].nameid;
		sd->inventory_data[i] = itemdb_search(id);
	}
	return 0;
}

int pc_calcweapontype(struct map_session_data *sd)
{
	if(sd->weapontype1 != 0 &&	sd->weapontype2 == 0)
		sd->status.weapon = sd->weapontype1;
	if(sd->weapontype1 == 0 &&	sd->weapontype2 != 0)// 嵍庤晲婍 Only
		sd->status.weapon = sd->weapontype2;
	else if(sd->weapontype1 == 1 && sd->weapontype2 == 1)// 憃抁寱
		sd->status.weapon = 0x11;
	else if(sd->weapontype1 == 2 && sd->weapontype2 == 2)// 憃扨庤寱
		sd->status.weapon = 0x12;
	else if(sd->weapontype1 == 6 && sd->weapontype2 == 6)// 憃扨庤晙
		sd->status.weapon = 0x13;
	else if( (sd->weapontype1 == 1 && sd->weapontype2 == 2) ||
		(sd->weapontype1 == 2 && sd->weapontype2 == 1) ) // 抁寱 - 扨庤寱
		sd->status.weapon = 0x14;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产福利精品一区| 国产精品二区一区二区aⅴ污介绍| 三级不卡在线观看| 91精品国产综合久久久久| 偷窥国产亚洲免费视频| 日韩一二三区不卡| 福利一区二区在线观看| 亚洲日本在线天堂| 欧美夫妻性生活| 国产一区二区三区在线观看免费 | 亚洲私人黄色宅男| 欧美午夜一区二区三区| 免费不卡在线视频| 国产日产欧美一区| 色国产精品一区在线观看| 午夜免费久久看| 国产女人18毛片水真多成人如厕| 99久久久久久| 青青草97国产精品免费观看无弹窗版 | 奇米影视在线99精品| 久久午夜国产精品| 色天天综合久久久久综合片| 日韩av中文字幕一区二区| 久久九九久久九九| 欧美午夜一区二区三区免费大片| 精品亚洲成a人| 综合自拍亚洲综合图不卡区| 欧美一级黄色片| jlzzjlzz欧美大全| 蜜乳av一区二区三区| 亚洲欧洲精品一区二区三区| 91精品啪在线观看国产60岁| 国产成人精品综合在线观看| 午夜成人免费视频| 国产精品电影一区二区| 91精品国产综合久久蜜臀| www.在线欧美| 精品一区二区三区影院在线午夜| 国产精品乱码久久久久久 | 日韩欧美一级二级三级| av一区二区三区| 九九国产精品视频| 一区二区三区在线不卡| 国产日韩av一区| 精品久久久久久最新网址| 91片黄在线观看| 国产一二精品视频| 无码av中文一区二区三区桃花岛| 中文字幕一区在线观看| 精品国产一区二区三区久久影院| 欧美综合欧美视频| 成人黄色一级视频| 国产呦萝稀缺另类资源| 另类小说一区二区三区| 亚洲动漫第一页| 亚洲男人的天堂在线观看| 国产女人水真多18毛片18精品视频 | 久久国产精品99久久久久久老狼| 亚洲小少妇裸体bbw| 亚洲欧美怡红院| 中日韩av电影| 国产欧美精品一区二区三区四区 | 色999日韩国产欧美一区二区| 国产高清不卡一区| 国产综合色产在线精品| 蜜桃视频第一区免费观看| 五月婷婷另类国产| 午夜影视日本亚洲欧洲精品| 玉米视频成人免费看| 亚洲你懂的在线视频| 亚洲四区在线观看| 亚洲激情在线播放| 亚洲精品成a人| 樱花影视一区二区| 亚洲午夜在线视频| 亚洲不卡av一区二区三区| 亚洲午夜成aⅴ人片| 亚洲国产精品久久久久秋霞影院 | 国产乱码精品1区2区3区| 久久激情五月婷婷| 国产在线精品一区二区不卡了 | 三级成人在线视频| 免费的国产精品| 极品少妇xxxx偷拍精品少妇| 激情伊人五月天久久综合| 精品一区二区三区影院在线午夜| 国产乱人伦偷精品视频不卡| 国产高清不卡二三区| 91在线观看免费视频| 在线一区二区三区做爰视频网站| 在线观看日韩国产| 91麻豆精品久久久久蜜臀| 日韩欧美国产精品一区| 久久亚洲精精品中文字幕早川悠里| 久久综合色8888| 亚洲欧美日韩在线不卡| 亚洲高清视频中文字幕| 强制捆绑调教一区二区| 国产精品1区2区3区| 92精品国产成人观看免费 | 国产一区二三区| 99国产欧美久久久精品| 欧美三级中文字幕| 欧美精品一区二区三区一线天视频| 国产清纯在线一区二区www| 中文字幕一区二区三区蜜月| 亚洲国产精品自拍| 精品一区二区三区香蕉蜜桃 | 91国内精品野花午夜精品 | 国产福利91精品一区| 91浏览器打开| 制服丝袜亚洲网站| 国产女人18毛片水真多成人如厕| 亚洲综合无码一区二区| 精品一区二区成人精品| 91亚洲男人天堂| 日韩区在线观看| 综合在线观看色| 日韩成人av影视| av电影一区二区| 日韩一区二区三区观看| 亚洲欧洲国产专区| 日本欧美加勒比视频| 成人精品视频一区二区三区尤物| 欧洲一区二区三区免费视频| 久久综合九色综合欧美就去吻 | 99视频在线精品| 91精品国产综合久久蜜臀| 国产精品国产精品国产专区不蜜| 日韩国产欧美在线观看| 99视频在线精品| 久久精品视频免费| 日韩成人免费电影| 91行情网站电视在线观看高清版| 久久精品视频在线免费观看| 天堂va蜜桃一区二区三区| 99精品视频一区| 精品成人私密视频| 日韩电影在线一区二区三区| 91在线视频播放地址| 久久久久国产精品麻豆 | 国产专区综合网| 日韩一区二区高清| 亚洲一级在线观看| 99久久精品免费看国产| 国产拍欧美日韩视频二区| 免费观看30秒视频久久| 欧美美女黄视频| 亚洲综合激情网| 91丨porny丨首页| 国产精品久久久久久一区二区三区| 极品尤物av久久免费看| 日韩欧美一卡二卡| 日本不卡的三区四区五区| 欧美最猛性xxxxx直播| 亚洲精品videosex极品| 色综合色狠狠综合色| 国产精品电影院| 波多野结衣视频一区| 日本一区二区动态图| 国产另类ts人妖一区二区| 26uuu精品一区二区三区四区在线 26uuu精品一区二区在线观看 | 欧美日韩国产色站一区二区三区| 亚洲免费毛片网站| 色哟哟在线观看一区二区三区| 亚洲欧美在线视频| 日本精品视频一区二区| 一区二区在线观看免费视频播放 | 人人狠狠综合久久亚洲| 911精品国产一区二区在线| 日韩在线a电影| 日韩欧美一级精品久久| 国产乱人伦精品一区二区在线观看| 久久天天做天天爱综合色| 国产成人在线网站| 国产精品毛片大码女人| 日本丶国产丶欧美色综合| 亚洲综合激情小说| 欧美巨大另类极品videosbest | 蜜臀av性久久久久蜜臀aⅴ四虎| 911精品产国品一二三产区| 日本美女一区二区| 精品福利一区二区三区免费视频| 国产一区高清在线| 中文字幕一区二区三区蜜月| 日本精品视频一区二区| 日韩综合在线视频| 精品剧情在线观看| 成人小视频在线| 一区二区三区成人| 在线成人av影院| 国产一区日韩二区欧美三区| 中文字幕精品综合| 在线免费一区三区| 美国欧美日韩国产在线播放| 久久精品欧美一区二区三区麻豆| 99久久国产综合精品女不卡| 亚洲图片自拍偷拍| 欧美精品一区二区精品网| 99在线精品一区二区三区|