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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? pc.c

?? 最新的仙鏡傳說服務器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;
}

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


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

	// 巰朣忬懺偩偭偨偺偱hp傪1丄埵抲傪僙乕僽応強偵曄峏
	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;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕在线一区二区三区| 欧美军同video69gay| 国产午夜精品福利| 国产精品99久久久久久久vr | 国产精品久久久久久久蜜臀| 国产在线播放一区三区四| 日韩欧美一区在线观看| 激情文学综合插| 国产女同性恋一区二区| 成人黄页在线观看| 亚洲精品菠萝久久久久久久| 欧美最新大片在线看| 日韩中文字幕麻豆| 日韩精品一区二区三区在线观看 | 国产综合久久久久久鬼色 | 国产一区二区网址| 国产精品视频一二| 93久久精品日日躁夜夜躁欧美| 亚洲人成网站色在线观看| 欧美午夜不卡视频| 久久精品久久综合| 国产精品久久一级| 欧美日韩精品欧美日韩精品一综合| 日韩av电影免费观看高清完整版在线观看| 91麻豆精品国产自产在线观看一区 | 成人av网站在线| 亚洲美女在线国产| 日韩精品最新网址| 99国产精品久| 青青草国产精品97视觉盛宴 | 国产日韩欧美电影| 欧美系列亚洲系列| 国产美女一区二区| 亚洲国产视频一区二区| 久久新电视剧免费观看| 91国在线观看| 国内成人自拍视频| 99久久精品国产精品久久| 亚洲精品国产一区二区精华液| 51精品秘密在线观看| 福利电影一区二区| 亚洲第一av色| 国产精品久久久久天堂| 日韩欧美高清dvd碟片| 99久久99久久综合| 久久国产精品免费| 亚洲亚洲人成综合网络| 国产视频视频一区| 3751色影院一区二区三区| 成人av网址在线| 国内久久精品视频| 三级亚洲高清视频| 亚洲色图在线视频| 久久精品在线免费观看| 91精品国产91久久久久久最新毛片 | 大美女一区二区三区| 天天av天天翘天天综合网色鬼国产 | 91麻豆精品久久久久蜜臀| 国产精品国产三级国产有无不卡 | 久久综合九色欧美综合狠狠| 欧美三级电影精品| av中文字幕在线不卡| 精品一区二区三区的国产在线播放| 亚洲综合一区二区| 国产精品免费av| 久久久久久久久97黄色工厂| 欧美精三区欧美精三区| 欧美在线播放高清精品| 99精品视频中文字幕| 国产成人超碰人人澡人人澡| 国内精品伊人久久久久影院对白| 视频一区在线视频| 无码av免费一区二区三区试看 | 久久九九久久九九| 日韩欧美国产一区在线观看| 91精品国产综合久久精品麻豆| 色噜噜久久综合| 色综合久久综合网97色综合| 成人黄色小视频| 丁香啪啪综合成人亚洲小说| 国产成人在线电影| 高清在线不卡av| 成人午夜av在线| 成人性生交大片| bt7086福利一区国产| 99久久精品情趣| 99re这里只有精品视频首页| 99国产欧美另类久久久精品| 91久久精品网| 欧美日韩免费视频| 欧美久久久一区| 精品日本一线二线三线不卡| 久久久99精品久久| 国产精品午夜免费| 《视频一区视频二区| 一区二区三区小说| 三级成人在线视频| 九九热在线视频观看这里只有精品| 日韩主播视频在线| 国产剧情av麻豆香蕉精品| 狠狠色丁香久久婷婷综合_中| 国产剧情在线观看一区二区| 99久精品国产| 欧美色网站导航| 欧美xxxx在线观看| 亚洲欧洲国产日本综合| 亚洲一线二线三线久久久| 免费精品99久久国产综合精品| 国精产品一区一区三区mba视频 | 欧美在线你懂的| 91麻豆精品国产自产在线观看一区 | 欧美一级欧美三级在线观看| 久久女同精品一区二区| 国产日韩成人精品| 一区二区三区美女| 韩国精品在线观看| 在线日韩国产精品| 精品国产伦一区二区三区免费| 国产精品久久一卡二卡| 天天av天天翘天天综合网色鬼国产 | 国产精品一二三区| 色吊一区二区三区| 欧美久久久久久久久久| 国产日本欧洲亚洲| 天天色综合成人网| www.欧美精品一二区| 91精品国产综合久久久蜜臀图片| 国产三级三级三级精品8ⅰ区| 亚洲精品中文在线观看| 久久精品国产澳门| 在线观看国产一区二区| 久久亚洲精精品中文字幕早川悠里| 亚洲女子a中天字幕| 精品一区二区三区久久久| 欧美亚洲综合色| 国产精品天干天干在线综合| 日本免费新一区视频| 一本高清dvd不卡在线观看| 精品人在线二区三区| 午夜精品一区二区三区三上悠亚| 国产91丝袜在线播放0| 欧美一二三区在线观看| 亚洲另类色综合网站| 国产激情偷乱视频一区二区三区| 欧美三级一区二区| 国产精品电影院| 久国产精品韩国三级视频| 欧美无人高清视频在线观看| 国产精品欧美久久久久一区二区| 久久精品国产久精国产| 欧美日韩免费观看一区二区三区| 中文字幕一区日韩精品欧美| 国产在线视视频有精品| 91精品一区二区三区久久久久久 | 亚洲国产va精品久久久不卡综合 | 免费欧美在线视频| 欧美日韩成人综合在线一区二区| 中文字幕日本乱码精品影院| 国产在线不卡一区| 日韩色视频在线观看| 天天色天天操综合| 欧美亚洲国产一区二区三区va | 亚洲一二三四久久| 91看片淫黄大片一级在线观看| 国产日产欧美一区| 风间由美一区二区av101| 精品国产一区二区三区av性色| 午夜不卡av在线| 欧美色男人天堂| 亚洲小少妇裸体bbw| 欧美日韩视频第一区| 亚洲成人一区在线| 欧美日韩视频在线第一区| 亚洲aaa精品| 亚洲大型综合色站| 91精彩视频在线| 亚洲第一狼人社区| 欧美一卡2卡3卡4卡| 久久精品国产99国产精品| xnxx国产精品| 高清在线观看日韩| 亚洲欧美国产77777| 欧美丝袜丝交足nylons| 丝袜亚洲另类丝袜在线| 欧美一卡二卡在线观看| 国内不卡的二区三区中文字幕| 国产亚洲成av人在线观看导航| 国产成人av影院| 亚洲欧洲三级电影| 欧美性受xxxx| 美女视频黄a大片欧美| 久久久久久97三级| 99久久伊人久久99| 亚洲国产精品麻豆| 日韩一区二区电影| 丁香婷婷综合五月| 亚洲中国最大av网站| 欧美一区二区三区在线电影| 韩国一区二区三区| 亚洲精品视频自拍|