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

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

?? int_storage.c

?? 最新的仙鏡傳說服務(wù)器C語言源碼
?? C
字號(hào):
#include "inter.h"
#include "int_storage.h"
#include "int_guild.h"
#include "mmo.h"
#include "char.h"
#include "socket.h"
#include "db.h"
#include "lock.h"

#include <string.h>
#include <stdlib.h>

// 僼傽僀儖柤偺僨僼僅儖僩
// inter_config_read()偱嵞愝掕偝傟傞
char storage_txt[1024]="save/storage.txt";
char guild_storage_txt[1024]="save/g_storage.txt";

static struct dbt *storage_db;
static struct dbt *guild_storage_db;

// 憅屔僨乕僞傪暥帤楍偵曄姺
int storage_tostr(char *str,struct storage *p)
{
	int i,f=0;
	char *str_p = str;
	str_p += sprintf(str_p,"%d,%d\t",p->account_id,p->storage_amount);

	for(i=0;i<MAX_STORAGE;i++)
		if( (p->storage[i].nameid) && (p->storage[i].amount) ){
			str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
				p->storage[i].id,p->storage[i].nameid,p->storage[i].amount,p->storage[i].equip,
				p->storage[i].identify,p->storage[i].refine,p->storage[i].attribute,
				p->storage[i].card[0],p->storage[i].card[1],p->storage[i].card[2],p->storage[i].card[3]);
			f++;
		}

	*(str_p++)='\t';

	*str_p='\0';
	if(!f)
		str[0]=0;
	return 0;
}
/*
int storage_tostr(char *str,struct storage *p)
{
	int i,f=1;
	sprintf(str,"%d,%d",p->account_id,p->storage_amount);

	strcat(str,"\t");
	for(i=0;i<MAX_STORAGE;i++)
	if( (p->storage[i].nameid) && (p->storage[i].amount) ){
		f=0;
		sprintf(str+strlen(str),"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
		  p->storage[i].id,p->storage[i].nameid,p->storage[i].amount,p->storage[i].equip,
		  p->storage[i].identify,p->storage[i].refine,p->storage[i].attribute,
		  p->storage[i].card[0],p->storage[i].card[1],p->storage[i].card[2],p->storage[i].card[3]);
	}

	strcat(str,"\t");

	if(f)
		str[0]=0;
	return 0;
}
*/

// 暥帤楍傪憅屔僨乕僞偵曄姺
int storage_fromstr(char *str,struct storage *p)
{
	int tmp_int[256];
	int set,next,len,i;

	set=sscanf(str,"%d,%d%n",&tmp_int[0],&tmp_int[1],&next);
	p->storage_amount=tmp_int[1];

	if(set!=2)
		return 1;
	if(str[next]=='\n' || str[next]=='\r')
		return 0;	
	next++;
	for(i=0;str[next] && str[next]!='\t';i++){
		set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
		  &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
		  &tmp_int[4],&tmp_int[5],&tmp_int[6],
		  &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
		if(set!=11)
			return 1;
		p->storage[i].id=tmp_int[0];
		p->storage[i].nameid=tmp_int[1];
		p->storage[i].amount=tmp_int[2];
		p->storage[i].equip=tmp_int[3];
		p->storage[i].identify=tmp_int[4];
		p->storage[i].refine=tmp_int[5];
		p->storage[i].attribute=tmp_int[6];
		p->storage[i].card[0]=tmp_int[7];
		p->storage[i].card[1]=tmp_int[8];
		p->storage[i].card[2]=tmp_int[9];
		p->storage[i].card[3]=tmp_int[10];

		next+=len;
		if(str[next]==' ')
			next++;
	}
	return 0;
}

int guild_storage_tostr(char *str,struct guild_storage *p)
{
	int i,f=0;
	char *str_p = str;
	str_p+=sprintf(str,"%d,%d\t",p->guild_id,p->storage_amount);

	for(i=0;i<MAX_GUILD_STORAGE;i++)
		if( (p->storage[i].nameid) && (p->storage[i].amount) ){
			str_p += sprintf(str_p,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d ",
				p->storage[i].id,p->storage[i].nameid,p->storage[i].amount,p->storage[i].equip,
				p->storage[i].identify,p->storage[i].refine,p->storage[i].attribute,
				p->storage[i].card[0],p->storage[i].card[1],p->storage[i].card[2],p->storage[i].card[3]);
			f++;
		}

	*(str_p++)='\t';

	*str_p='\0';
	if(!f)
		str[0]=0;
	return 0;
}

int guild_storage_fromstr(char *str,struct guild_storage *p)
{
	int tmp_int[256];
	int set,next,len,i;

	set=sscanf(str,"%d,%d%n",&tmp_int[0],&tmp_int[1],&next);
	p->storage_amount=tmp_int[1];

	if(set!=2)
		return 1;
	if(str[next]=='\n' || str[next]=='\r')
		return 0;	
	next++;
	for(i=0;str[next] && str[next]!='\t';i++){
		set=sscanf(str+next,"%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d%n",
		  &tmp_int[0],&tmp_int[1],&tmp_int[2],&tmp_int[3],
		  &tmp_int[4],&tmp_int[5],&tmp_int[6],
		  &tmp_int[7],&tmp_int[8],&tmp_int[9],&tmp_int[10],&len);
		if(set!=11)
			return 1;
		p->storage[i].id=tmp_int[0];
		p->storage[i].nameid=tmp_int[1];
		p->storage[i].amount=tmp_int[2];
		p->storage[i].equip=tmp_int[3];
		p->storage[i].identify=tmp_int[4];
		p->storage[i].refine=tmp_int[5];
		p->storage[i].attribute=tmp_int[6];
		p->storage[i].card[0]=tmp_int[7];
		p->storage[i].card[1]=tmp_int[8];
		p->storage[i].card[2]=tmp_int[9];
		p->storage[i].card[3]=tmp_int[10];

		next+=len;
		if(str[next]==' ')
			next++;
	}
	return 0;
}

// 傾僇僂儞僩偐傜憅屔僨乕僞僀儞僨僢僋僗傪摼傞乮怴婯憅屔捛壛壜擻乯
struct storage *account2storage(int account_id)
{
	struct storage *s;
	s=numdb_search(storage_db,account_id);
	if(s == NULL) {
		s = calloc(sizeof(struct storage), 1);
		if(s==NULL){
			printf("int_storage: out of memory!\n");
			exit(0);
		}
		memset(s,0,sizeof(struct storage));
		s->account_id=account_id;
		numdb_insert(storage_db,s->account_id,s);
	}
	return s;
}

struct guild_storage *guild2storage(int guild_id)
{
	struct guild_storage *gs = NULL;
	if(inter_guild_search(guild_id) != NULL) {
		gs=numdb_search(guild_storage_db,guild_id);
		if(gs == NULL) {
			gs = calloc(sizeof(struct guild_storage), 1);
			if(gs==NULL){
				printf("int_storage: out of memory!\n");
				exit(0);
			}
			memset(gs,0,sizeof(struct guild_storage));
			gs->guild_id=guild_id;
			numdb_insert(guild_storage_db,gs->guild_id,gs);
		}
	}
	return gs;
}

//---------------------------------------------------------
// 憅屔僨乕僞傪撉傒崬傓
int inter_storage_init()
{
	char line[65536];
	int c=0,tmp_int;
	struct storage *s;
	struct guild_storage *gs;
	FILE *fp;

	storage_db = numdb_init();

	fp=fopen(storage_txt,"r");
	if(fp==NULL){
		printf("cant't read : %s\n",storage_txt);
		return 1;
	}
	while(fgets(line,65535,fp)){
		sscanf(line,"%d",&tmp_int);
		s=calloc(sizeof(struct storage), 1);
		if(s==NULL){
			printf("int_storage: out of memory!\n");
			exit(0);
		}
		memset(s,0,sizeof(struct storage));
		s->account_id=tmp_int;
		if(s->account_id > 0 && storage_fromstr(line,s) == 0) {
			numdb_insert(storage_db,s->account_id,s);
		}
		else{
			printf("int_storage: broken data [%s] line %d\n",storage_txt,c);
			free(s);
		}
		c++;
	}
	fclose(fp);

	c = 0;
	guild_storage_db = numdb_init();

	fp=fopen(guild_storage_txt,"r");
	if(fp==NULL){
		printf("cant't read : %s\n",guild_storage_txt);
		return 1;
	}
	while(fgets(line,65535,fp)){
		sscanf(line,"%d",&tmp_int);
		gs=calloc(sizeof(struct guild_storage), 1);
		if(gs==NULL){
			printf("int_storage: out of memory!\n");
			exit(0);
		}
		memset(gs,0,sizeof(struct guild_storage));
		gs->guild_id=tmp_int;
		if(gs->guild_id > 0 && guild_storage_fromstr(line,gs) == 0) {
			numdb_insert(guild_storage_db,gs->guild_id,gs);
		}
		else{
			printf("int_storage: broken data [%s] line %d\n",guild_storage_txt,c);
			free(gs);
		}
		c++;
	}
	fclose(fp);

	return 0;
}

int inter_storage_save_sub(void *key,void *data,va_list ap)
{
	char line[65536];
	FILE *fp;
	storage_tostr(line,(struct storage *)data);
	fp=va_arg(ap,FILE *);
	if(*line)
		fprintf(fp,"%s" RETCODE,line);
	return 0;
}
//---------------------------------------------------------
// 憅屔僨乕僞傪彂偒崬傓
int inter_storage_save()
{
	FILE *fp;
	int lock;
	if( (fp=lock_fopen(storage_txt,&lock))==NULL ){
		printf("int_storage: cant write [%s] !!! data is lost !!!\n",storage_txt);
		return 1;
	}
	numdb_foreach(storage_db,inter_storage_save_sub,fp);
	lock_fclose(fp,storage_txt,&lock);
//	printf("int_storage: %s saved.\n",storage_txt);
	return 0;
}

int inter_guild_storage_save_sub(void *key,void *data,va_list ap)
{
	char line[65536];
	FILE *fp;
	if(inter_guild_search(((struct guild_storage *)data)->guild_id) != NULL) {
		guild_storage_tostr(line,(struct guild_storage *)data);
		fp=va_arg(ap,FILE *);
		if(*line)
			fprintf(fp,"%s" RETCODE,line);
	}
	return 0;
}
//---------------------------------------------------------
// 憅屔僨乕僞傪彂偒崬傓
int inter_guild_storage_save()
{
	FILE *fp;
	int  lock;
	if( (fp=lock_fopen(guild_storage_txt,&lock))==NULL ){
		printf("int_storage: cant write [%s] !!! data is lost !!!\n",guild_storage_txt);
		return 1;
	}
	numdb_foreach(guild_storage_db,inter_guild_storage_save_sub,fp);
	lock_fclose(fp,guild_storage_txt,&lock);
//	printf("int_storage: %s saved.\n",guild_storage_txt);
	return 0;
}

int inter_storage_delete(int account_id)
{
	struct storage *s = numdb_search(storage_db,account_id);
	if(s) {
		numdb_erase(storage_db,account_id);
		free(s);
	}
	return 0;
}

int inter_guild_storage_delete(int guild_id)
{
	struct guild_storage *gs = numdb_search(guild_storage_db,guild_id);
	if(gs) {
		numdb_erase(guild_storage_db,guild_id);
		free(gs);
	}
	return 0;
}

//---------------------------------------------------------
// map server傊偺捠怣

// 憅屔僨乕僞偺憲怣
int mapif_load_storage(int fd,int account_id)
{
	struct storage *s=account2storage(account_id);
	WFIFOW(fd,0)=0x3810;
	WFIFOW(fd,2)=sizeof(struct storage)+8;
	WFIFOL(fd,4)=account_id;
	memcpy(WFIFOP(fd,8),s,sizeof(struct storage));
	WFIFOSET(fd,WFIFOW(fd,2));
	return 0;
}
// 憅屔僨乕僞曐懚姰椆憲怣
int mapif_save_storage_ack(int fd,int account_id)
{
	WFIFOW(fd,0)=0x3811;
	WFIFOL(fd,2)=account_id;
	WFIFOB(fd,6)=0;
	WFIFOSET(fd,7);
	return 0;
}

int mapif_load_guild_storage(int fd,int account_id,int guild_id)
{
	struct guild_storage *gs=guild2storage(guild_id);
	WFIFOW(fd,0)=0x3818;
	if(gs) {
		WFIFOW(fd,2)=sizeof(struct guild_storage)+12;
		WFIFOL(fd,4)=account_id;
		WFIFOL(fd,8)=guild_id;
		memcpy(WFIFOP(fd,12),gs,sizeof(struct guild_storage));
	}
	else {
		WFIFOW(fd,2)=12;
		WFIFOL(fd,4)=account_id;
		WFIFOL(fd,8)=0;
	}
	WFIFOSET(fd,WFIFOW(fd,2));

	return 0;
}
int mapif_save_guild_storage_ack(int fd,int account_id,int guild_id,int fail)
{
	WFIFOW(fd,0)=0x3819;
	WFIFOL(fd,2)=account_id;
	WFIFOL(fd,6)=guild_id;
	WFIFOB(fd,10)=fail;
	WFIFOSET(fd,11);
	return 0;
}

//---------------------------------------------------------
// map server偐傜偺捠怣

// 憅屔僨乕僞梫媮庴怣
int mapif_parse_LoadStorage(int fd)
{
	mapif_load_storage(fd,RFIFOL(fd,2));
	return 0;
}
// 憅屔僨乕僞庴怣仌曐懚
int mapif_parse_SaveStorage(int fd)
{
	struct storage *s;
	int account_id=RFIFOL(fd,4);
	int len=RFIFOW(fd,2);
	if(sizeof(struct storage)!=len-8){
		printf("inter storage: data size error %d %d\n",sizeof(struct storage),len-8);
	}
	else {
		s=account2storage(account_id);
		memcpy(s,RFIFOP(fd,8),sizeof(struct storage));
		mapif_save_storage_ack(fd,account_id);
	}
	return 0;
}

int mapif_parse_LoadGuildStorage(int fd)
{
	mapif_load_guild_storage(fd,RFIFOL(fd,2),RFIFOL(fd,6));
	return 0;
}
int mapif_parse_SaveGuildStorage(int fd)
{
	struct guild_storage *gs;
	int guild_id=RFIFOL(fd,8);
	int len=RFIFOW(fd,2);
	if(sizeof(struct guild_storage)!=len-12){
		printf("inter storage: data size error %d %d\n",sizeof(struct guild_storage),len-12);
	}
	else {
		gs=guild2storage(guild_id);
		if(gs) {
			memcpy(gs,RFIFOP(fd,12),sizeof(struct guild_storage));
			mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,0);
		}
		else
			mapif_save_guild_storage_ack(fd,RFIFOL(fd,4),guild_id,1);
	}
	return 0;
}

// map server 偐傜偺捠怣
// 丒侾僷働僢僩偺傒夝愅偡傞偙偲
// 丒僷働僢僩挿僨乕僞偼inter.c偵僙僢僩偟偰偍偔偙偲
// 丒僷働僢僩挿僠僃僢僋傗丄RFIFOSKIP偼屇傃弌偟尦偱峴傢傟傞偺偱峴偭偰偼側(cè)傜側(cè)偄
// 丒僄儔乕側(cè)傜0(false)丄偦偆偱側(cè)偄側(cè)傜1(true)傪偐偊偝側(cè)偗傟偽側(cè)傜側(cè)偄
int inter_storage_parse_frommap(int fd)
{
	switch(RFIFOW(fd,0)){
	case 0x3010: mapif_parse_LoadStorage(fd); break;
	case 0x3011: mapif_parse_SaveStorage(fd); break;
	case 0x3018: mapif_parse_LoadGuildStorage(fd); break;
	case 0x3019: mapif_parse_SaveGuildStorage(fd); break;
	default:
		return 0;
	}
	return 1;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
人人狠狠综合久久亚洲| 国产不卡视频在线播放| 久久久久久99精品| 欧美视频一区二区三区四区| 国产一区二区导航在线播放| 亚洲成人先锋电影| 国产精品热久久久久夜色精品三区 | 亚洲男人天堂一区| 2021中文字幕一区亚洲| 678五月天丁香亚洲综合网| fc2成人免费人成在线观看播放 | 亚洲国产精品影院| 日本一区二区三区四区| 欧美一三区三区四区免费在线看| 95精品视频在线| 国产美女在线精品| 美女视频网站黄色亚洲| 亚洲一二三专区| 亚洲精品乱码久久久久久黑人| 国产偷v国产偷v亚洲高清| 日韩欧美国产午夜精品| 欧美久久久一区| 欧美伊人久久久久久久久影院| 99re亚洲国产精品| 成人教育av在线| 成人高清视频免费观看| 国产乱码精品一品二品| 韩国女主播一区二区三区| 蜜桃av噜噜一区| 免费黄网站欧美| 日本sm残虐另类| 偷窥国产亚洲免费视频| 亚洲国产精品久久久久婷婷884 | 欧美午夜一区二区三区免费大片| 色婷婷综合久久久中文字幕| 91在线视频官网| 91美女蜜桃在线| 色婷婷一区二区三区四区| 91色在线porny| 色哟哟国产精品| 色视频成人在线观看免| 91蜜桃在线免费视频| 99精品视频在线观看| 99久久精品免费精品国产| 91最新地址在线播放| 91丨porny丨最新| 欧美亚洲动漫精品| 欧美日韩在线播放三区四区| 欧美日韩一级黄| 91精品国产欧美一区二区成人| 欧美一区二区在线观看| 欧美成人女星排名| 久久嫩草精品久久久精品一| 中国色在线观看另类| 中文字幕一区二区在线观看| 亚洲伦理在线精品| 亚洲国产精品久久人人爱| 天涯成人国产亚洲精品一区av| 日本在线不卡视频| 国产一区二区三区免费| 成人国产精品视频| 色婷婷亚洲婷婷| 制服丝袜亚洲网站| 精品国产一区二区三区忘忧草| 日本一区二区高清| 亚洲伦在线观看| 日韩av电影天堂| 国产91精品欧美| 欧美伊人久久大香线蕉综合69| 日韩美一区二区三区| 国产日韩高清在线| 亚洲欧洲综合另类在线| 石原莉奈在线亚洲二区| 韩日精品视频一区| 91丨九色丨蝌蚪丨老版| 欧美一区二区视频观看视频| 国产欧美一区二区精品久导航| 亚洲久草在线视频| 青草国产精品久久久久久| 成人综合在线视频| 欧美日韩视频专区在线播放| 久久蜜桃av一区二区天堂| 亚洲欧美日韩中文播放 | 欧美日精品一区视频| 欧美xxxx老人做受| 日韩美女精品在线| 日韩vs国产vs欧美| 成人av网站在线观看| 欧美精品99久久久**| 国产精品色哟哟网站| 日韩二区三区在线观看| av动漫一区二区| 久久人人97超碰com| 一区二区久久久久久| 国产又粗又猛又爽又黄91精品| 色欧美片视频在线观看| 久久影院视频免费| 五月天一区二区| 91在线精品一区二区三区| 日韩三级电影网址| 一区二区三区中文字幕在线观看| 久久国产日韩欧美精品| 欧美性欧美巨大黑白大战| 国产欧美日本一区二区三区| 日韩vs国产vs欧美| 欧洲精品一区二区| 国产精品视频免费看| 国内精品伊人久久久久影院对白| 欧美色手机在线观看| 国产精品视频在线看| 麻豆成人久久精品二区三区小说| 精品视频一区二区三区免费| 亚洲欧美精品午睡沙发| 国产一区二区在线观看视频| 欧美一区二区三区免费| 亚洲一区二区三区免费视频| 91一区二区在线观看| 国产蜜臀av在线一区二区三区| 久久er99热精品一区二区| 欧美精品乱码久久久久久按摩| 亚洲最大成人综合| 91女厕偷拍女厕偷拍高清| 中文字幕精品三区| 国产不卡在线一区| 久久久三级国产网站| 韩国成人福利片在线播放| 日韩视频在线你懂得| 婷婷激情综合网| 制服视频三区第一页精品| 亚洲成人精品在线观看| 欧洲精品中文字幕| 亚洲午夜在线电影| 在线欧美日韩精品| 亚洲自拍另类综合| 欧美日韩一区在线观看| 亚州成人在线电影| 欧美精品一卡二卡| 日韩综合小视频| 日韩亚洲欧美中文三级| 另类小说综合欧美亚洲| 久久在线免费观看| 国产.精品.日韩.另类.中文.在线.播放| 久久精品在这里| 成人一区二区三区视频在线观看| 中文字幕第一区| 91色乱码一区二区三区| 亚洲一区二区三区影院| 在线电影欧美成精品| 毛片基地黄久久久久久天堂| 日韩视频免费直播| 国产在线播放一区二区三区| 国产精品人成在线观看免费| 一本一道波多野结衣一区二区| 一区二区视频在线| 欧美男生操女生| 国内精品不卡在线| 国产精品久久午夜夜伦鲁鲁| 91国产成人在线| 美国毛片一区二区三区| 欧美经典三级视频一区二区三区| 91视频xxxx| 热久久国产精品| 国产精品污污网站在线观看| 在线亚洲+欧美+日本专区| 美女视频一区在线观看| 亚洲国产精华液网站w| 在线观看一区不卡| 久久99精品久久只有精品| 国产欧美日韩一区二区三区在线观看| 一本大道综合伊人精品热热| 欧美—级在线免费片| 国产一区二区三区日韩| 亚洲欧美另类小说视频| 欧美三级中文字幕在线观看| 亚洲成人www| 2014亚洲片线观看视频免费| 97精品久久久午夜一区二区三区 | 日韩美女一区二区三区四区| 成人免费av网站| 亚洲aⅴ怡春院| 日本一区二区三区四区| 91丨porny丨国产入口| 国产乱人伦偷精品视频不卡| 国产精品一区二区在线观看网站| 国产欧美日韩综合精品一区二区| 日韩一区二区在线观看视频| 欧美日韩在线免费视频| 91蜜桃传媒精品久久久一区二区| 国产成人精品亚洲777人妖| 美女视频免费一区| 午夜精品一区二区三区电影天堂 | 午夜av区久久| 一区二区三区免费看视频| 日本一区二区三区视频视频| 久久久www免费人成精品| 欧美xxxxxxxx| 2023国产一二三区日本精品2022| 欧美不卡视频一区| 精品久久久久久久久久久久包黑料 | 波多野洁衣一区|