⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 int_pet.c

📁 传奇3源程序, 用vc开发的
💻 C
字号:
#include "inter.h"#include "int_pet.h"#include "mmo.h"#include "char.h"#include "socket.h"#include "db.h"#include "lock.h"
#include <stdio.h>#include <stdlib.h>#include <string.h>char pet_txt[1024]="save/pet.txt";static struct dbt *pet_db;static int pet_newid = 100;int inter_pet_tostr(char *str,struct s_pet *p){	int len;	if(p->hungry < 0)		p->hungry = 0;	else if(p->hungry > 100)		p->hungry = 100;	if(p->intimate < 0)		p->intimate = 0;	else if(p->intimate > 1000)		p->intimate = 1000;	len=sprintf(str,"%d,%d,%s\t%d,%d,%d,%d,%d,%d,%d,%d,%d",		p->pet_id,p->class,p->name,p->account_id,p->char_id,p->level,p->egg_id,		p->equip,p->intimate,p->hungry,p->rename_flag,p->incuvate);	return 0;}int inter_pet_fromstr(char *str,struct s_pet *p){	int s;	int tmp_int[16];	char tmp_str[256];		memset(p,0,sizeof(struct s_pet));	//	printf("sscanf pet main info\n");	s=sscanf(str,"%d,%d,%[^\t]\t%d,%d,%d,%d,%d,%d,%d,%d,%d",&tmp_int[0],&tmp_int[1],tmp_str,&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]);	if(s!=12)		return 1;		p->pet_id = tmp_int[0];	p->class = tmp_int[1];	memcpy(p->name,tmp_str,24);	p->account_id = tmp_int[2];	p->char_id = tmp_int[3];	p->level = tmp_int[4];	p->egg_id = tmp_int[5];	p->equip = tmp_int[6];	p->intimate = tmp_int[7];	p->hungry = tmp_int[8];	p->rename_flag = tmp_int[9];	p->incuvate = tmp_int[10];	if(p->hungry < 0)		p->hungry = 0;	else if(p->hungry > 100)		p->hungry = 100;	if(p->intimate < 0)		p->intimate = 0;	else if(p->intimate > 1000)		p->intimate = 1000;	return 0;}int inter_pet_init(){	char line[8192];	struct s_pet *p;	FILE *fp;	int c=0;	pet_db=numdb_init();	if( (fp=fopen(pet_txt,"r"))==NULL )		return 1;	while(fgets(line,sizeof(line),fp)){		p=calloc(sizeof(struct s_pet), 1);		if(p==NULL){			printf("int_pet: out of memory!\n");			exit(0);		}		memset(p,0,sizeof(struct s_pet));		if(inter_pet_fromstr(line,p)==0 && p->pet_id>0){			if( p->pet_id >= pet_newid)				pet_newid=p->pet_id+1;			numdb_insert(pet_db,p->pet_id,p);		}else{			printf("int_pet: broken data [%s] line %d\n",pet_txt,c);			free(p);		}		c++;	}	fclose(fp);//	printf("int_pet: %s read done (%d pets)\n",pet_txt,c);	return 0;}int inter_pet_save_sub(void *key,void *data,va_list ap){	char line[8192];	FILE *fp;	inter_pet_tostr(line,(struct s_pet *)data);	fp=va_arg(ap,FILE *);	fprintf(fp,"%s" RETCODE,line);	return 0;}int inter_pet_save(){	FILE *fp;	int lock;	if( (fp=lock_fopen(pet_txt,&lock))==NULL ){		printf("int_pet: cant write [%s] !!! data is lost !!!\n",pet_txt);		return 1;	}	numdb_foreach(pet_db,inter_pet_save_sub,fp);	lock_fclose(fp,pet_txt,&lock);//	printf("int_pet: %s saved.\n",pet_txt);	return 0;}int inter_pet_delete(int pet_id){	struct s_pet *p;	p = numdb_search(pet_db,pet_id);	if( p == NULL)		return 1;	else {		numdb_erase(pet_db,pet_id);		printf("pet_id: %d deleted\n",pet_id);	}	return 0;}int mapif_pet_created(int fd,int account_id,struct s_pet *p){	WFIFOW(fd,0)=0x3880;	WFIFOL(fd,2)=account_id;	if(p!=NULL){		WFIFOB(fd,6)=0;		WFIFOL(fd,7)=p->pet_id;		printf("int_pet: created! %d %s\n",p->pet_id,p->name);	}else{		WFIFOB(fd,6)=1;		WFIFOL(fd,7)=0;	}	WFIFOSET(fd,11);	return 0;}int mapif_pet_info(int fd,int account_id,struct s_pet *p){	WFIFOW(fd,0)=0x3881;	WFIFOW(fd,2)=sizeof(struct s_pet) + 9;	WFIFOL(fd,4)=account_id;	WFIFOB(fd,8)=0;	memcpy(WFIFOP(fd,9),p,sizeof(struct s_pet));	WFIFOSET(fd,WFIFOW(fd,2));	return 0;}int mapif_pet_noinfo(int fd,int account_id){	WFIFOW(fd,0)=0x3881;	WFIFOW(fd,2)=sizeof(struct s_pet) + 9;	WFIFOL(fd,4)=account_id;	WFIFOB(fd,8)=1;	memset(WFIFOP(fd,9),0,sizeof(struct s_pet));	WFIFOSET(fd,WFIFOW(fd,2));	return 0;}int mapif_save_pet_ack(int fd,int account_id,int flag){	WFIFOW(fd,0)=0x3882;	WFIFOL(fd,2)=account_id;	WFIFOB(fd,6)=flag;	WFIFOSET(fd,7);	return 0;}int mapif_delete_pet_ack(int fd,int flag){	WFIFOW(fd,0)=0x3883;	WFIFOB(fd,2)=flag;	WFIFOSET(fd,3);	return 0;}int mapif_create_pet(int fd,int account_id,int char_id,short pet_class,short pet_lv,short pet_egg_id,	short pet_equip,short intimate,short hungry,char rename_flag,char incuvate,char *pet_name){	struct s_pet *p;	p=malloc(sizeof(struct s_pet));	if(p==NULL){		printf("int_pet: out of memory !\n");		mapif_pet_created(fd,account_id,NULL);		return 0;	}	memset(p,0,sizeof(struct s_pet));	p->pet_id = pet_newid++;	memcpy(p->name,pet_name,24);	if(incuvate == 1)		p->account_id = p->char_id = 0;	else {		p->account_id = account_id;		p->char_id = char_id;	}	p->class = pet_class;	p->level = pet_lv;	p->egg_id = pet_egg_id;	p->equip = pet_equip;	p->intimate = intimate;	p->hungry = hungry;	p->rename_flag = rename_flag;	p->incuvate = incuvate;	if(p->hungry < 0)		p->hungry = 0;	else if(p->hungry > 100)		p->hungry = 100;	if(p->intimate < 0)		p->intimate = 0;	else if(p->intimate > 1000)		p->intimate = 1000;		numdb_insert(pet_db,p->pet_id,p);		mapif_pet_created(fd,account_id,p);		return 0;}int mapif_load_pet(int fd,int account_id,int char_id,int pet_id){	struct s_pet *p;	p=numdb_search(pet_db,pet_id);	if(p!=NULL) {		if(p->incuvate == 1) {			p->account_id = p->char_id = 0;			mapif_pet_info(fd,account_id,p);		}		else if(account_id == p->account_id && char_id == p->char_id)			mapif_pet_info(fd,account_id,p);		else			mapif_pet_noinfo(fd,account_id);	}	else		mapif_pet_noinfo(fd,account_id);	return 0;}int mapif_save_pet(int fd,int account_id,struct s_pet *data){	struct s_pet *p;	int pet_id;	int len=RFIFOW(fd,2);	if(sizeof(struct s_pet)!=len-8) {		printf("inter pet: data size error %d %d\n",sizeof(struct s_pet),len-8);	}	else{		pet_id = data->pet_id;		p=numdb_search(pet_db,pet_id);		if(p == NULL) {			p=malloc(sizeof(struct s_pet));			if(p==NULL){				printf("int_pet: out of memory !\n");				mapif_save_pet_ack(fd,account_id,1);				return 0;			}			memset(p,0,sizeof(struct s_pet));			p->pet_id = data->pet_id;			if(p->pet_id == 0)				data->pet_id = p->pet_id = pet_newid++;			numdb_insert(pet_db,p->pet_id,p);				}		if(data->hungry < 0)			data->hungry = 0;		else if(data->hungry > 100)			data->hungry = 100;		if(data->intimate < 0)			data->intimate = 0;		else if(data->intimate > 1000)			data->intimate = 1000;		memcpy(p,data,sizeof(struct s_pet));		if(p->incuvate == 1)			p->account_id = p->char_id = 0;		mapif_save_pet_ack(fd,account_id,0);	}	return 0;}int mapif_delete_pet(int fd,int pet_id){	mapif_delete_pet_ack(fd,inter_pet_delete(pet_id));	return 0;}int mapif_parse_CreatePet(int fd){	mapif_create_pet(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOW(fd,10),RFIFOW(fd,12),RFIFOW(fd,14),RFIFOW(fd,16),RFIFOL(fd,18),		RFIFOL(fd,20),RFIFOB(fd,22),RFIFOB(fd,23),RFIFOP(fd,24));	return 0;}int mapif_parse_LoadPet(int fd){	mapif_load_pet(fd,RFIFOL(fd,2),RFIFOL(fd,6),RFIFOL(fd,10));	return 0;}int mapif_parse_SavePet(int fd){	mapif_save_pet(fd,RFIFOL(fd,4),(struct s_pet *)RFIFOP(fd,8));	return 0;}int mapif_parse_DeletePet(int fd){	mapif_delete_pet(fd,RFIFOL(fd,2));	return 0;}// map server 偐傜偺捠怣// 丒侾僷働僢僩偺傒夝愅偡傞偙偲// 丒僷働僢僩挿僨乕僞偼inter.c偵僙僢僩偟偰偍偔偙偲// 丒僷働僢僩挿僠僃僢僋傗丄RFIFOSKIP偼屇傃弌偟尦偱峴傢傟傞偺偱峴偭偰偼側傜側偄// 丒僄儔乕側傜0(false)丄偦偆偱側偄側傜1(true)傪偐偊偝側偗傟偽側傜側偄int inter_pet_parse_frommap(int fd){	switch(RFIFOW(fd,0)){	case 0x3080: mapif_parse_CreatePet(fd); break;	case 0x3081: mapif_parse_LoadPet(fd); break;	case 0x3082: mapif_parse_SavePet(fd); break;	case 0x3083: mapif_parse_DeletePet(fd); break;	default:		return 0;	}	return 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -