item.c

来自「CS反恐精英1.6的部分C源代码。」· C语言 代码 · 共 429 行 · 第 1/2 页

C
429
字号
//
// PvPGN YARE MOD V1.0 (Yeat Another Ragnarok Emulator) - (Server)
// Copyright (c) Project-YARE & PvPGN 2003
// www.project-yare.com
// forum.project-yare.net
// www.pvpgn.org
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
// item.c - File for including special items, etc.
{
// searching for itemID
int search_item(int object){
	char file_name[40];
	char strgat[80];
	char gomi[40];
	FILE *fp;
	int scount=0,fcount=0,nameid=0;
	
	printf("object:%d\n",object);
	if(object==1){
		strcpy(file_name,"item_all.list");
		scount = (int)(((double)rand()/(double)RAND_MAX)*1061.0);
		printf("scount:%d\n",scount);
	}else if(object==2){
		strcpy(file_name,"item_equipment.list");
		scount = (int)(((double)rand()/(double)RAND_MAX)*490.0);
	}else if(object==3){
		strcpy(file_name,"item_card.list");
		scount = (int)(((double)rand()/(double)RAND_MAX)*149.0);
	}else if(object==4){
		strcpy(file_name,"item_present.list");
		scount = (int)(((double)rand()/(double)RAND_MAX)*77.0);
	}
	if((fp = fopen(file_name,"r"))==NULL){
		printf("Opened Successfully!\n");
	}
	for(fcount=0;fcount<scount;fcount++){//the file乫s scount to susumu(?)(峴栚傑偱偡偡傓)
		fgets(strgat,80,fp);
	}
	fclose(fp);
	sscanf(strgat,"%d%s",&nameid,gomi);
	printf("itemID:%d          item name:%s\n",nameid,gomi);
	return nameid;
}


// check to see if itemID exists
int is_item(int object){
	char str[80];
	FILE *fp;
	int item_id=0,result=0;
	
	if((fp = fopen("item_all.list","r"))==NULL){
		printf("Opened Successfully!\n");
	}
	while(fgets(str,80,fp)!=NULL){
		sscanf(str,"%d",&item_id);
		if(item_id==object){
			result=1;//found
				break;
		}
	}
	fclose(fp);
	return result;
}
/**********************************************************************************************/

// item use
     	int nameid=p->inventory[RFIFOW(fd,2)-2].nameid;
     	short option;
     	double bonus=0;//Vit recovery
     	item_num = itemdb_type(p->inventory[RFIFOW(fd,2)-2].nameid);//inventory baggage 
  		p=&sd->status;
     	if(item_num==0){//if recovery item
			WFIFOW(fd,0) = 0xa8;
			WFIFOW(fd,2) = RFIFOW(fd,2);
			WFIFOW(fd,4) = --p->inventory[RFIFOW(fd,2)-2].amount;
			WFIFOB(fd,6) = 01;
			WFIFOSET(fd,7);
			if(p->inventory[RFIFOW(fd,2)-2].amount <= 0){
				p->inventory[RFIFOW(fd,2)-2].nameid=0;
			}
			//recovery amount丂=丂乮amount of recovery item乯*乮1 + VIT/100 + recovery skill level/10)
				if(p->skill[3].lv >= 1){
					bonus = ((double)p->skill[3].lv)/10.0;
				}
				bonus += ((double)(p->vit+100)/(double)100);
			//srand((unsigned)time(NULL));//random number
			if(nameid==501){//red potion
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 44)+30) * bonus;
			}else if(nameid==502){//orange potion
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 69)+50) * bonus;
			}else if(nameid==503){//yellow potion
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 104)+80) * bonus;
			}else if(nameid==504){//white potion
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 120)+149) * bonus;
			}else if(nameid==505){//blue potion
				p->sp += (double)((((double)rand()/(double)RAND_MAX) * 45)+53);
			}else if(nameid==506){//green potion(poison recovery)
				option = 0x0038;
				p->option = p->option & option;// turn off flag unless peco or cart
				WFIFOW(fd,0)=0x0119;
				WFIFOL(fd,2)=sd->account_id;
				WFIFOW(fd,6)=0;
				WFIFOW(fd,8)=0;
				WFIFOW(fd,10)=p->option;
			mmo_map_sendarea( fd, WFIFOP(fd,0),packet_len_table[0x0119], 0 );
			}else if(nameid==507){//red herb
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 12)+19) * bonus;
			}else if(nameid==508){//yellow herb
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 21)+29) * bonus;
			}else if(nameid==509){//white herb
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 50)+50) * bonus;
			}else if(nameid==510){//blue herb
				p->sp += (double)((((double)rand()/(double)RAND_MAX) * 10)+17);
			}else if(nameid==511){//green herb(poison recovery)
				option = 0x0038;
				p->option = p->option & option;//turn off flag unless peco or cart
				WFIFOW(fd,0)=0x0119;
				WFIFOL(fd,2)=sd->account_id;
				WFIFOW(fd,6)=0;
				WFIFOW(fd,8)=0;
				WFIFOW(fd,10)=p->option;
			mmo_map_sendarea( fd, WFIFOP(fd,0),packet_len_table[0x0119], 0 );
			}else if(nameid==512){//apple
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 12)+15) * bonus;
			}else if(nameid==513){//banana
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 11)+15) * bonus;
			}else if(nameid==514){//grape
				p->sp += (double)((((double)rand()/(double)RAND_MAX) * 8)+11);
			}else if(nameid==515){//carrot
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 13)+15) * bonus;
			}else if(nameid==516){//potato
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 10)+14) * bonus;
			}else if(nameid==517){//meat
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 41)+55) * bonus;
			}else if(nameid==518){//honey
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 46)+66) * bonus;
				p->sp += (double)((((double)rand()/(double)RAND_MAX) * 5)+9);
			}else if(nameid==519){//milk
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 15)+22) * bonus;
			}else if(nameid==520){//leaf of hinale
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 60)+22) * bonus;
			}else if(nameid==521){//leaf of aloe
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 150)+25) * bonus;
			}else if(nameid==522){//fruit of mastela
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 200)+200) * bonus;
			}else if(nameid==523){//holy water(zombie destroyer)
				option = 0x0038;
				p->option = p->option & option;//turn off flag unless peco or cart
				WFIFOW(fd,0)=0x0119;
				WFIFOL(fd,2)=sd->account_id;
				WFIFOW(fd,6)=0;
				WFIFOW(fd,8)=0;
				WFIFOW(fd,10)=p->option;
			mmo_map_sendarea( fd, WFIFOP(fd,0),packet_len_table[0x0119], 0 );
			}else if(nameid==525){//panacea(recover abnormal status) 
				option = 0x0038;
				p->option = p->option & option;//turn off flag unless peco or cart
				WFIFOW(fd,0)=0x0119;
				WFIFOL(fd,2)=sd->account_id;
				WFIFOW(fd,6)=0;
				WFIFOW(fd,8)=0;
				WFIFOW(fd,10)=p->option;
			mmo_map_sendarea( fd, WFIFOP(fd,0),packet_len_table[0x0119], 0 );
			}else if(nameid==526){//royal jelly(HP/SP recovery)
				p->sp = p->max_sp;
				p->hp = p->max_hp;
			}else if(nameid==528){//monster feed
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 41)+55) * bonus;
			}else if(nameid==529){//candy
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 30)+44) * bonus;
			}else if(nameid==530){//candy stripper
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 60)+88) * bonus;
			}else if(nameid==531){//apple juice
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 15)+22) * bonus;
			}else if(nameid==532){//banana juice
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 15)+22) * bonus;
			}else if(nameid==533){//grape juice
				p->sp += (double)((((double)rand()/(double)RAND_MAX) * 30)+22);
			}else if(nameid==534){//carrot juice
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 15)+22) * bonus;
			}else if(nameid==535){//pumpkin
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 12)+15) * bonus;
			}else if(nameid==536){//ice cream
				p->sp += (double)((((double)rand()/(double)RAND_MAX) * 150)+10) * bonus;
			}else if(nameid==538){//well baked cookie
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 500)+10) * bonus;
			}else if(nameid==539){//cake
				p->hp += (double)((((double)rand()/(double)RAND_MAX) * 1500)+10) * bonus;
			}

			if(p->hp > p->max_hp){//when max HP is reached
				p->hp = p->max_hp;//set to max HP
			}
			if(p->sp > p->max_sp){//when max SP is reached
				p->sp = p->max_sp;//set to max SP
			}
			
/*
R 00b0 <type>.w <val>.l
	Below are the renewal of various ability values. type: corresponds with numeric values

⌨️ 快捷键说明

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