📄 client.cpp
字号:
}
//获取str名称的填充资源mobj相关信息
bool GetObjectInfo(SOCKET sock,string& str,Myobject& mobj)
{
SCommand scom;
scom.CommandID=CMD_GETOBJECTINFO;
scom.DataSize=(int)str.length();
int nRet=send(sock,(char*)&scom,sizeof(scom),0);
if(nRet==SOCKET_ERROR)
{
cout<<"发送获取资源命令出错,请检查网络!"<<endl;
return false;
}
nRet=send(sock,str.c_str(),(int)str.length(),0);
if(nRet==SOCKET_ERROR)
{
cout<<"发送获取资源数据出错,请检查网络!"<<endl;
return false;
}
/*int datasize=0;
nRet=recv(sock,(char*)&datasize,sizeof(int),0);
if(nRet==SOCKET_ERROR)
{
cout<<"接收资源数据出错,请检查网络!"<<endl;
return false;
}*/
nRet=recv(sock,(char*)&mobj,sizeof(mobj),0);
if(nRet==SOCKET_ERROR)
{
cout<<"接收物品资源数据出错,请检查网络!"<<endl;
return false;
}
return true;
}
//彩色文字输出函数
void ColorTextOut(const char * str,bool bUnderLine)
{
HANDLE hWnd=GetStdHandle(STD_OUTPUT_HANDLE);
if(bUnderLine)
SetConsoleTextAttribute(hWnd,FOREGROUND_GREEN|FOREGROUND_BLUE|COMMON_LVB_UNDERSCORE);
else
SetConsoleTextAttribute(hWnd,FOREGROUND_GREEN|FOREGROUND_BLUE);
cout<<str;
SetConsoleTextAttribute(hWnd,FOREGROUND_BLUE|FOREGROUND_GREEN|FOREGROUND_RED);
}
//游戏退出时的数据保存
void SaveGameData(SOCKET sock)
{
}
//更新各种数据!
void UpdateData(SOCKET sock)
{
//更新在线数据
GetOnlineRoleList(sock);
GetGameMessage(sock);
}
//特色功能之一
//显示背包物品,并使用物品,(包括辅助药品,装备的支持)
//处理背包物品的存储管理,(对多种多数量的支持)
void UseThinginPackage(SOCKET sock)
{
cout<<"*******************我的百宝箱*********************"<<endl;
int index=0;
for(int i=0;i<OBJECTNUM;i++)
{
if(g_player.ownObject[i].ownObjectName!="null")
{
cout<<"["<<(index++)<<"]"<<g_player.ownObject[i].ownObjectName<<" 数量:"<<g_player.ownObject[i].num<<endl;
}
else
{
cout<<"["<<(index++)<<"]"<<" 空 "<<endl;
}
}
if(index==0)
{
cout<<"你的背包里空空如也!"<<endl;
return;
}
//使用物品菜单
while(true)
{
char in;//因为物品刚好为10个,把数字键都占用了,所有提出字符转换的想法
int choice=-1;
updateNewDS useupdata;//使用数据
memset(&useupdata,0,sizeof(useupdata));
updateNewDS effupdata;//效果数据
memset(&effupdata,0,sizeof(effupdata));
updateNewDS backupdata;//备用数据
memset(&backupdata,0,sizeof(backupdata));
cout<<"请输入你要使用物品的序号,(序号外任意键退出)"<<endl;
cin>>in;
if(in>'9'||in<'0')
{
break;
}
choice=in-'0';//还原成数字
if(g_player.ownObject[choice].ownObjectName=="null")
{
cout<<"改格子没有存放任何物品!"<<endl;
return;
}
//使用数据指令
SCommand scom;
memset(&scom,0,sizeof(scom));
Myobject mobj;
memset(&mobj,0,sizeof(mobj));
//标识前后两次操作!(可能有第三项操作)
bool bfirstsuccess=false;
bool bsecondsuccess=false;
bool bthirdsuccess=false;
bool bbackused=false;
//辅助药品需要
if(GetObjectInfo(sock,g_player.ownObject[choice].ownObjectName,mobj))
{
if(g_player.level<mobj.needLevel)
{
ColorTextOut("[系统]",false);
cout<<"你的等级不够!"<<endl;
continue;
}
else
{
switch(mobj.moType)
{
case OT_HP:
g_player.ownObject[choice].num-=1;
//当某物品用完了
if(g_player.ownObject[choice].num==0)
{
//使用数据
strcpy(useupdata.item,"null");
useupdata.opType=DBOP_TYPE_ALL;
useupdata.num=0;
sprintf(useupdata.op,"objectname%d,objcetnum%d",choice+1,choice+1);
//更新本地状态
g_player.ownObject[choice].ownObjectName="null";
g_player.ownObject[choice].num=0;
}
else//还有某物品剩余
{
useupdata.num=g_player.ownObject[choice].num;
sprintf(useupdata.op,"objectnum%d",choice+1);
strcpy(useupdata.item,"null");
useupdata.opType=DBOP_TYPE_NUM;
}
//效果数据,公共部分
g_player.hp+=mobj.value;
if(g_player.hp>hpTop)//大于hp上限
g_player.hp=hpTop;
effupdata.num=g_player.hp;
strcpy(effupdata.op,"hp");
strcpy(effupdata.item,"null");
effupdata.opType=DBOP_TYPE_NUM;
break;
case OT_MP:
g_player.ownObject[choice].num-=1;
//当某物品用完了
if(g_player.ownObject[choice].num==0)
{
//使用数据
strcpy(useupdata.item,"null");
useupdata.opType=DBOP_TYPE_ALL;
useupdata.num=0;
sprintf(useupdata.op,"objectname%d,objcetnum%d",choice+1,choice+1);
//更新本地状态
g_player.ownObject[choice].ownObjectName="null";
g_player.ownObject[choice].num=0;
}
else//还有某物品剩余
{
useupdata.num=g_player.ownObject[choice].num;
sprintf(useupdata.op,"objectnum%d",choice+1);
strcpy(useupdata.item,"null");
useupdata.opType=DBOP_TYPE_NUM;
}
//效果数据,公共部分
g_player.mp+=mobj.value;
if(g_player.hp>mpTop)//大于hp上限
g_player.mp=mpTop;
effupdata.num=g_player.mp;
strcpy(effupdata.op,"mp");
strcpy(effupdata.item,"null");
effupdata.opType=DBOP_TYPE_NUM;
break;
//装备的更新
//从背包里减去该装备,在装备栏增加该装备,原已有装备,交换之。当换上的装备有多余时,需一格空间存储换下来的装备,如无,则换装失败
//
//装备类物品使用
case OT_ARMOUR:
if(g_player.ownEquip[0]=="null")//原来装备为空
{
if(g_player.ownObject[choice].num>1)//背包里有多件本装备
{
//本地数据修改
g_player.ownObject[choice].num-=1;
//数据报封装
useupdata.num=g_player.ownObject[choice].num;
sprintf(useupdata.op,"objectnum%d",choice+1);
strcpy(useupdata.item,"null");
useupdata.opType=DBOP_TYPE_NUM;
//身上装备数据修改
g_player.ownEquip[0]=g_player.ownObject[choice].ownObjectName;
//身上装备数据包封装
sprintf(effupdata.op,"equipname%d",1);
strcpy(effupdata.item,g_player.ownEquip[0].c_str());
effupdata.opType=DBOP_TYPE_STRING;
effupdata.num=0;
}
else//仅此一件
{
//身上装备数据修改
g_player.ownEquip[0]=g_player.ownObject[choice].ownObjectName;
//身上装备数据包封装
sprintf(effupdata.op,"equipname%d",1);
strcpy(effupdata.item,g_player.ownEquip[0].c_str());
effupdata.opType=DBOP_TYPE_STRING;
effupdata.num=0;
//换下装备数据修改
g_player.ownObject[choice].ownObjectName="null";
g_player.ownObject[choice].num-=1;
//数据包封装
useupdata.num=g_player.ownObject[choice].num;
strcpy(useupdata.item,g_player.ownObject[choice].ownObjectName.c_str());
sprintf(useupdata.op,"objectname%d objectnum&d",choice+1,choice+1);
useupdata.opType=DBOP_TYPE_ALL;
}
}
else//原来已有装备,换装
{
//转换中间量
string temp;
temp=g_player.ownEquip[0];
bool bGeted=false;//找到标识
bool bInsert=false;
if(g_player.ownObject[choice].num>1)//背包里有多于1件的该装备
{
for(int i=0;i<OBJECTNUM;i++)
{
if(g_player.ownObject[i].ownObjectName!="null")
{
if(g_player.ownObject[i].ownObjectName==temp)//背包中有本装备,
{
//换下的装备数据更改
g_player.ownObject[i].num++;
//换下装备数据包封装
sprintf(useupdata.op,"objectnum%d",i+1);
useupdata.num=g_player.ownObject[i].num;
strcpy(useupdata.item,"null");
useupdata.opType=DBOP_TYPE_NUM;
//身上装备修改
g_player.ownEquip[0]=g_player.ownObject[choice].ownObjectName;
//身上装备数据包封装
sprintf(effupdata.op,"equipname%d",1);
effupdata.opType=DBOP_TYPE_STRING;
strcpy(effupdata.item,g_player.ownEquip[0].c_str());
effupdata.num=0;
//换上的装备修改
g_player.ownObject[choice].num--;
//换上装备的数据封装
sprintf(backupdata.op,"objectnum%d",choice+1);
backupdata.num=g_player.ownObject[choice].num;
strcpy(backupdata.item,"null");
backupdata.opType=DBOP_TYPE_NUM;
bGeted=true;
}
}
else continue;
}
if(!bGeted)//没找到,找个空位子保存
{
for(int i=0;i<OBJECTNUM;i++)
{
if(g_player.ownObject[i].ownObjectName=="null")
{
//找到空位,保存
g_player.ownObject[i].ownObjectName=temp;
g_player.ownObject[i].num=1;
//换下数据包封装
sprintf(useupdata.op,"objectname%d objectnum%d",i+1,i+1);
strcpy(useupdata.item,temp.c_str());
useupdata.opType=DBOP_TYPE_ALL;
useupdata.num=1;
//身上装备修改
g_player.ownEquip[0]=g_player.ownObject[choice].ownObjectName;
//身上装备数据封装
sprintf(effupdata.op,"equipname%d",1);
strcpy(effupdata.item,g_player.ownEquip[0].c_str());
effupdata.opType=DBOP_TYPE_STRING;
effupdata.num=0;
//背包装备修改
g_player.ownObject[choice].num--;
//背包装备数据封装
sprintf(backupdata.op,"objectnum%d",choice+1);
backupdata.num=g_player.ownObject[choice].num;
strcpy(backupdata.item,"null");
backupdata.opType=DBOP_TYPE_NUM;
bInsert=true;
break;//保存后退出,遍历
}
}
if(!bInsert)//没找到,也没有位子
{
cout<<"你的东西太多了,装不下了!"<<endl;
return;
}
}
}
else//背包里只有一件本装备
{
bool bGeted=false;//判断换下装备是否有多件
//身上装备修改
g_player.ownEquip[0]=g_player.ownObject[choice].ownObjectName;
//封装数据包
sprintf(effupdata.op,"equipname%d",1);//数据库从1开始
effupdata.opType=DBOP_TYPE_STRING;
strcpy(effupdata.item,g_player.ownObject[choice].ownObjectName.c_str());
effupdata.num=0;
//换下装备在背包里有没有多的
int i=0;
for(;i<OBJECTNUM;i++)
{
if(g_player.ownObject[i].ownObjectName==temp)
{
bGeted=true;
break;
}
}
if(bGeted)//背包里有同样换下装备
{
//背包装备数据修改
g_player.ownObject[i].num++;
//背包数据封装
sprintf(useupdata.op,"objectnum%d",i+1);
useupdata.num=g_player.ownObject[i].num;
useupdata.opType=DBOP_TYPE_NUM;
strcpy(useupdata.item,"null");
//换上装备本地数据处理
g_player.ownObject[choice].num--;
g_player.ownObject[choice].ownObjectName="null";
//换上装备数据包封装
sprintf(backupdata.op,"objectname%d objectnum%d",choice+1,choice+1);
strcpy(backupdata.item,"null");
backupdata.num=g_player.ownObject[choice].num;
backupdata.opType=DBOP_TYPE_ALL;
}
else//没有找到,互换
{
//背包数据修改
g_player.ownObject[choice].ownObjectName=temp;
//封装数据包
strcpy(useupdata.item,temp.c_str());
sprintf(useupdata.op,"objectname%d objectnum%d",choice+1,choice+1);
useupdata.num=1;
useupdata.opType=DBOP_TYPE_ALL;
}
}
}
break;
case OT_ARM:
if(g_player.ownEquip[1]=="null")//原来装备为空
{
//g_player.ownObject[choice].ownObjectName="null";
if(g_player.ownObject[choice].num>1)//背包里有多件本装备
{
//换上装备数据修改
g_player.ownObject[choice].num-=1;
//换上装备数据报封装
useupdata.num=g_player.ownObject[choice].num;
sprintf(useupdata.op,"objectnum%d",choice+1);
strcpy(useupdata.item,"null");
useupdata.opType=DBOP_TYPE_NUM;
//身上装备数据修改
g_player.ownEquip[1]=g_player.ownObject[choice].ownObjectName;
//身上装备数据修改
sprintf(effupdata.op,"equipname%d",2);
strcpy(effupdata.item,g_player.ownEquip[1].c_str());
effupdata.opType=DBOP_TYPE_STRING;
effupdata.num=0;
}
else//仅此一件
{
//身上装备数据修改
g_player.ownEquip[1]=g_player.ownObject[choice].ownObjectName;
//身上装备数据修改
sprintf(effupdata.op,"equipname%d",2);
strcpy(effupdata.item,g_player.ownEquip[1].c_str());
effupdata.opType=DBOP_TYPE_STRING;
effupdata.num=0;
//换上装备数据修改
g_player.ownObject[choice].ownObjectName="null";
g_player.ownObject[choice].num-=1;
//换上装备数据包封装
useupdata.num=g_player.ownObject[choice].num;
strcpy(useupdata.item,g_player.ownObject[choice].ownObjectName.c_str());
sprintf(useupdata.op,"objectname%d objectnum&d",choice+1,choice+1);
useupdata.opType=DBOP_TYPE_ALL;
}
}
else//原来已有装备,换装
{
//转换中间量
string temp;
temp=g_player.ownEquip[1];
bool bGeted=false;//找到标识
bool bInsert=false;
if(g_player.ownObject[choice].num>1)//背包里有多于1件的该装备
{
for(int i=0;i<OBJECTNUM;i++)
{
if(g_player.ownObject[i].ownObjectName!="null")
{
if(g_player.ownObject[i].ownObjectName==temp)//背包中有本装备,
{
//换下的装备数据更改
g_player.ownObject[i].num++;
//换下装备数据包封装
sprintf(useupdata.op,"objectnum%d",i+1);
useupdata.num=g_player.ownObject[i].num;
strcpy(useupdata.item,"null");
useupdata.opType=DBOP_TYPE_NUM;
//身上装备修改
g_player.ownEquip[1]=g_player.ownObject[choice].ownObjectName;
//身上装
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -