📄 menuserver.cpp
字号:
#include "..\stdafx.h"
#include "..\LowerLayers\servertable.h"
#include "..\LowerLayers\recvmsg.h"
#include "..\LowerLayers\mylog.h"
#include "DefaultHeader.h"
#include "MenuDefine.h"
#include "ItemList.h"
#include "CItem.h"
#include "Scrp_exe.h"
#include "SealStone.h"
#include "SealStonegameserver.h"
#include "op_magic.h"
#include "map.h"
#include "teambattle.h"
#include "gamblerate.h"
#include "LTSSupport.h"
#include "Skill_lsw.h"
#include "GmMgr.h"
#include "eventmgr.h" //021030 YGI
#include "LogManager.h"
#include "UserManager.h"
#include "DualManager.h"
#include "GuildManager.h"
#include "ArenaManager.h"
const int SIZE_GR_BS = 50; // CSD-030326
const int SIZE_GR_RS = 100; // CSD-030326
CGambleRateData g_game_rate_data;
CAliveMapZoneAll g_AliveMap; // 登混酒 朝荐 乐绰 脚傈抛捞喉
extern struct CItem_List Item_Ref ;
extern bool exist(int item_no, int char_id, POS &source);
extern void getItemIndex(int item_no, int &type, int &index);
extern int GetItemValueSell( ItemAttr *item );
extern void CleanUpConnection(short idServer);
void SendStoreItemList( int cn, int storelistindex, int menud);
void SendCallSmallMenu( int cn, int storelistindex, int menu );
void SendCallDualMagicLearnMenu( int cn);//soto-030421
int LoadGuildItem( char *filename, int num );
char g_szPassWordName[20];
int storelist_attr[ MAX_STORE_LIST][ MAX_STORE_ITEM_LIST]; // 荤绰 拱扒 颇绰 拱扒 加己
ItemAttr storelist[ MAX_STORE_LIST][ MAX_STORE_ITEM_LIST];
int storelistmax[ MAX_STORE_LIST];
// 惑沥狼 Item 加己篮 概老 官诧促.
// 捞窃荐绰 澜.. 1老俊 茄锅沥档 龋免登绢具 茄促.
static inline void swap( int *a, int *b )
{
int t = *a;
*a = *b;
*b = t;
}
void MakeStoreList( void )
{
char temp[ FILENAME_MAX];
wsprintf( temp, "%s/data/BLACKSMITH.txt", GameServerDataPath ); storelistmax[ BLACKSMITH ] = LoadGuildItem( temp, BLACKSMITH ); //措厘埃
MyLog( LOG_NORMAL, " Store 'BLACKSMITH' itemlist number : %d", storelistmax[ BLACKSMITH ] );
wsprintf( temp, "%s/data/FARM.txt", GameServerDataPath ); storelistmax[ FARM ] = LoadGuildItem( temp, FARM ); //丑厘
MyLog( LOG_NORMAL, " Store 'FARM' itemlist number : %d", storelistmax[ FARM] );
wsprintf( temp, "%s/data/RESTAURANT.txt", GameServerDataPath ); storelistmax[ RESTAURANT ] = LoadGuildItem( temp, RESTAURANT ); //夸府痢
MyLog( LOG_NORMAL, " Store 'RESTAURANT' itemlist number : %d", storelistmax[ RESTAURANT] );
wsprintf( temp, "%s/data/HERBSHOP.txt", GameServerDataPath ); storelistmax[ HERBSHOP ] = LoadGuildItem( temp, HERBSHOP ); //距檬痢
MyLog( LOG_NORMAL, " Store 'HERBSHOP' itemlist number : %d", storelistmax[ HERBSHOP ] );
wsprintf( temp, "%s/data/SHAMBLES.txt", GameServerDataPath ); storelistmax[ SHAMBLES ] = LoadGuildItem( temp, SHAMBLES ); //仟赁埃
MyLog( LOG_NORMAL, " Store 'SHAMBLES' itemlist number : %d", storelistmax[ SHAMBLES ] );
wsprintf( temp, "%s/data/CANDLE.txt", GameServerDataPath ); storelistmax[ CANDLE ] = LoadGuildItem( temp, CANDLE ); //剧檬痢
MyLog( LOG_NORMAL, " Store 'CANDLE' itemlist number : %d", storelistmax[ CANDLE ] );
wsprintf( temp, "%s/data/SLOPSHOP.txt", GameServerDataPath ); storelistmax[ SLOPSHOP ] = LoadGuildItem( temp, SLOPSHOP ); //狼惑角
MyLog( LOG_NORMAL, " Store 'SLOPSHOP' itemlist number : %d", storelistmax[ SLOPSHOP ] );
wsprintf( temp, "%s/data/ALCHEMY.txt", GameServerDataPath ); storelistmax[ ALCHEMY ] = LoadGuildItem( temp, ALCHEMY ); //楷陛家
MyLog( LOG_NORMAL, " Store 'ALCHEMY' itemlist number : %d", storelistmax[ ALCHEMY ] );
wsprintf( temp, "%s/data/WOODWORKING.txt", GameServerDataPath );storelistmax[ WOODWORKING] = LoadGuildItem( temp, WOODWORKING ); //格傍家
MyLog( LOG_NORMAL, " Store 'WOODWORKING'itemlist number : %d", storelistmax[WOODWORKING] );
wsprintf( temp, "%s/data/BOWCRAFT.txt", GameServerDataPath); storelistmax[ BOWCRAFT ] = LoadGuildItem( temp, BOWCRAFT ); //劝苞拳混
MyLog( LOG_NORMAL, " Store 'BOWCRAFT' itemlist number : %d", storelistmax[ BOWCRAFT ] );
wsprintf( temp, "%s/data/SHIPYARD.txt", GameServerDataPath ); storelistmax[ SHIPYARD ] = LoadGuildItem( temp, SHIPYARD ); //炼急家
MyLog( LOG_NORMAL, " Store 'SHIPYARD' itemlist number : %d", storelistmax[ SHIPYARD ] );
wsprintf( temp, "%s/data/PUB.txt", GameServerDataPath ); storelistmax[ PUB ] = LoadGuildItem( temp, PUB ); //林痢
MyLog( LOG_NORMAL, " Store 'PUB' itemlist number : %d", storelistmax[ PUB ] );
wsprintf( temp, "%s/data/STORE.txt", GameServerDataPath ); storelistmax[ STORE ] = LoadGuildItem( temp, STORE ); //棱拳惑
MyLog( LOG_NORMAL, " Store 'STORE' itemlist number : %d", storelistmax[ STORE ] );
wsprintf( temp, "%s/data/MAGIC_GUILD.txt", GameServerDataPath );storelistmax[MAGIC_GUILD ] = LoadGuildItem( temp, MAGIC_GUILD ); //付过荤
MyLog( LOG_NORMAL, " Store 'MAGIC_GUILD'itemlist number : %d", storelistmax[ MAGIC_GUILD ] );
}
void CallSmallMenu(int cn, int storelistindex, int menu)
{ //< CSD-030509
switch (menu)
{
case MN_SKILLGUILD_REPAIR:
case MN_SHOP_SELL:
case MN_SHOP_BUY:
{
SendStoreItemList(cn, storelistindex, menu);
break;
}
case MN_SKILLGUILD_BUY:
case MN_SKILLGUILD_SELL:
{
SendStoreItemList(cn, storelistindex, menu);
SendCallSmallMenu(cn, storelistindex, menu);
break;
}
case MN_ARENA_LOBBY:
{
CBaseArena* pGame = g_pArenaManager->GetGameInfo(storelistindex);
if (pGame != NULL)
{ //< CSD-TW-030627
if (!pGame->IsPlayGame())
{
SendCallSmallMenu(cn, storelistindex, menu);
return;
}
CHARLIST* pTarget = CheckServerId(cn);
if (pTarget != NULL)
{
pGame->SendRemainTime(pTarget, g_curr_time);
}
} //> CSD-TW-030627
break;
}
default:
{
SendCallSmallMenu(cn, storelistindex, menu);
break;
}
}
} //> CSD-030509
// 010815 YGI
void RecvItemBuy( int cn, t_client_item_buy *p )
{
CHARLIST *ch = CheckServerId( cn );
if( !ch ) return;
// ch->Money = GetMoneyByItem( ch );
int store_id = p->store_id;
int itemno = p->item_no;
int a,b,c;
int itempos;
if( store_id >= MAX_STORE_LIST ) return; // Error....
if( !itemno ) return;
for( itempos=0; itempos<storelistmax[store_id]; itempos++)
{
if( storelist_attr[store_id][itempos] == SIT_EVENT_ITEM ||
storelist_attr[store_id][itempos] == SIT_NULL ||
storelist_attr[store_id][itempos] == SIT_ONLY_BUY ) continue;
if( itemno == storelist[ store_id][itempos].item_no )
{
break;
}
}
if( itempos == storelistmax[store_id] ) return; // 捞 惑痢俊 绝绰 酒捞袍捞促.
ItemAttr *item = &storelist[ store_id][itempos];
CItem *t = ItemUnit( *item );
if( !t ) return;
const DWORD price = t->GetValue();
if( ch->Money < price ) return; // 老窜 捣 绝栏搁 救等促.
//Quick 阑 八祸窍咯 IK_POTION_BOX 牢啊.. 秦辑
const int iItemNo = item->item_no;
bool bHavePotionBox = false;
for(int i=0; i < ITEM_QUICK_MAX; i++)
{
if( !ch->quick[i].item_no ){continue;}//酒捞袍捞 绝栏搁 牧萍春
CItem *tt = ItemMgr.ConvertItemNoToCItem( ch->quick[i].item_no );
if( !tt ) continue;
if(IK_POTION_BOX == tt->GetItemKind())
{
bHavePotionBox = true;
break;
}
}
if(bHavePotionBox)
{
CPotionBox potion_box( ch );
if( potion_box.PutItem( item ) ) // 器记 惑磊俊 甸绢艾促.
{
if( SubtractMoney( price, ch ) == -1 ) // 家瘤陛俊辑 啊拜阑 哗焊绊
{
// 角菩窍搁 器记 促矫 化绰促.
potion_box.DeleteItem();
}
*item = GenerateItem( iItemNo); // 迫绊 抄 饶 货肺款 酒捞抛 积己 ( 捞霸 惑痢老 版快父栏肺 官操带瘤 秦具窃.. )
return;
}
}
int ret = 0;
if( t->GetRbutton() == DIVIDE_ITEM )
{
ret = SearchItemPosByNumber( item, a, b, c, ch );
}
if( !ret )
{
if( !SearchInv( ch->inv, a, b, c ) ) return; // 后磊府啊 绝促搁
}
// 捞力 角力肺 捣阑 哗夯促. 角菩窍搁 给 魂促.
if( SubtractMoney( price, ch ) == -1 ) return;
if( ch->inv[a][b][c].item_no )
{
ch->inv[a][b][c].attr[IATTR_MUCH] += item->attr[IATTR_MUCH];
}
else
{
ch->inv[a][b][c] = *item; // 咯扁辑 generater 窃荐甫 龋免窍瘤 臼绰 捞蜡绰 唱吝俊 漂喊茄 酒捞袍阑 迫版匡 措厚秦辑..
}
POS pos;
SetItemPos( INV, a, b, c, &pos );
SendServerEachItem( &pos , &ch->inv[a][b][c], cn ); // 积己等 酒捞袍阑 怖 麦绢 焊郴霖促.
SendItemEventLog( &ch->inv[a][b][c], cn, SN_NOT_USER, SILT_GET_STORE, 3 ); //YGI acer
*item = GenerateItem( iItemNo); // 迫绊 抄 饶 货肺款 酒捞抛 积己 ( 捞霸 惑痢老 版快父栏肺 官操带瘤 秦具窃.. )
return;
}
void RecvItemSell( int cn, t_client_item_sell *p )
{
CHARLIST *ch = CheckServerId( cn );
if( !ch ) return;
int store_id = p->store_id;
int pos = p->item_position;
int a = ( pos & 0x0060 ) >> 5;
int b = ( pos & 0x0018 ) >> 3;
int c = ( pos & 0x0007 );
if( a<0 || a>=3 || b<0 || b>=3 || c<0 || c>=8 ) return;
ItemAttr *item = &ch->inv[a][b][c];
if( !item->item_no ) return;
if( store_id > MAX_STORE_LIST) return;
if( store_id < 0) return;
int itempos=0;
for( itempos=0; itempos < storelistmax[store_id]; itempos++)
{
// 救登绰 版快匙
if( storelist_attr[store_id][itempos] == SIT_EVENT_ITEM ||
storelist_attr[store_id][itempos] == SIT_NULL ||
storelist_attr[store_id][itempos] == SIT_ONLY_SELL )
{
continue;
}
if( item->item_no == storelist[ store_id][itempos].item_no )
{
break;
}
}
if( itempos == storelistmax[store_id] ) return; //芭贰 阂啊 魄沥
if(::GiveMoney(ch,GetItemValueSell( item )))//021126 lsw// 捣阑 棵妨 霖促.
{//捣 罐阑 荐 绝绰 惑炔捞搁 魄概啊 救等促
if(item->attr[IATTR_RARE_MAIN])
{
const unsigned int uiRare = item->attr[IATTR_RARE_MAIN];
Send_RareItemMakeLog(cn,item->item_no,-2,
((LPRareMain)(&uiRare))->grade,
((LPRareMain)(&uiRare))->soksung1,
((LPRareMain)(&uiRare))->soksung2,
((LPRareMain)(&uiRare))->soksung3,
0,0,0,0,item->attr[IATTR_LIMIT],item->attr[IATTR_MUCH],0,-2);
}
::SendItemEventLog( item, cn, SN_NOT_USER, SILT_PUT_STORE, 3 ); //YGI acer
::DeleteItem( item );
}
}
#define MAX_RUMOR_TO_READ_ 5 // 佬歹甸老 风赣狼 弥措荐.
char RumorText[ MAX_RUMOR_TO_READ_][ TEXT_LENGTH];
void InitRumorText( char *filename )
{
FILE *fp;
char text[ TEXT_LENGTH];
int c,cc,i;
fp = fopen( filename, "rt" );
if( fp == NULL ) return;
c = 0;
while( fgets( text, TEXT_LENGTH, fp )) c++;
fseek( fp, 0, SEEK_SET );
for( cc=0, i=0 ; i < c ; i ++ )
{
fgets( text, TEXT_LENGTH, fp );
if( i >= c-5 )
{
strcpy( RumorText[cc], text );
cc++;
}
}
fclose(fp);
}
void SendRumor( t_connection c[], int cn )
{
static int count;
t_packet p;
p.h.header.type = CMD_MENU_MESSAGE;
{
p.u.server_menu_message.type = MM_RUMOR_;
strcpy( p.u.server_menu_message.text, RumorText[count] );
}
p.h.header.size = sizeof( t_server_menu_message ) - TEXT_LENGTH + strlen( RumorText[count] );
QueuePacket( c, cn, &p, 1 );
count++;
count %= MAX_RUMOR_TO_READ_;
}
//------------------------------------------------------------
/*/曼炼...
case MN_BLACKSMITH:
case MN_FARM :
case MN_RESTAURANT:
case MN_HERBSHOP:
case MN_SHAMBLES :
case MN_CANDLE :
case MN_SLOPSHOP :
case MN_ALCHEMY :
case MN_WOODWORKING:
case MN_BOWCRAFT :
case MN_SHIPYARD :
/********************************************************8
辨靛 Menu
#define CMD_GUILD_INFO 7000
typedef struct server_guild_info
{
}t_server_guild_info;
void SendGuildInfo( t_connection c[], int cn, int guildindex, int storeindex, int repairindex )
int guildindex, :
int storeindex, :
int repairindex :
. 胶农赋飘俊辑 角青登绢柳促.
*********************************************************/
void SendGuildInfo( t_connection c[], int cn )
{
t_packet p;
p.h.header.type = CMD_GUILD_INFO;
{
}
p.h.header.size = sizeof( t_server_guild_info );
QueuePacket( c, cn, &p, 1 );
}
//////////////////////////////////////////////////////////////////////////////////////
//
// 辑滚 瘤盔侩 皋家靛
//
//////////////////////////////////////////////////////////////////////////////////////
#define MAX_STR_WRITER 30
#define BBS_STRING_MAX 8192
typedef struct tag_public_notice
{
int no;
int date;
char writer[MAX_STR_WRITER];
char title[TEXT_LENGTH];
char *text;
}PublicNotice, *lpPublicNotice;
void FreePublicNotice( lpPublicNotice p )
{
p->no = 0;
p->date = 0;
strcpy(p->writer,"");
// if( p->title ) free(p->title);
// delete p->text;
}
PublicNotice public_notice[50];
void LoadPublicNotice( void )
{
for( int i=0; i<50; i++ ) // 盎脚阑 困茄 橇府
{
if( public_notice[i].no )
{
FreePublicNotice( &public_notice[i] );
}
}
char buf[BBS_STRING_MAX];
FILE *fp;
char filename[50];
sprintf(filename, ".\\data\\傍瘤荤亲.txt");
if( fp= fopen(filename, "rt") )
{
int i=0;
while( !feof(fp) )
{
int len;
fgets(buf, BBS_STRING_MAX, fp);
if( *buf == ';' ) continue;
char *token;
token = strtok(buf, "\t\n\r");
if( token == NULL ) break;
public_notice[i].no = atoi( token );
token = strtok(NULL, "\t\n\r");
if( token == NULL ) break;
public_notice[i].date = atoi( token );
token = strtok(NULL, "\t\n\r");
if( token == NULL ) break;
strcpy( public_notice[i].writer, token );
token = strtok(NULL, "\t\n\r");
len = strlen( token );
if( token == NULL ) break;
// public_notice[i].title = new char[len];
strcpy( public_notice[i].title, token );
// token = strtok(NULL, "\t\n\r");
// len = strlen( token );
// public_notice[i].text = new char[len];
// strcpy( public_notice[i].text, token );
i++;
}
}
else
{
MessageBox(NULL, "拳老 俊矾垒酒", "俊矾", MB_OK );
return;
}
fclose(fp);
}
void SendMessageTitle( int type, int count, t_connection c[], int cn )
{
// char date[10][ FILENAME_MAX];
char name[10][ FILENAME_MAX];
char title[10][ FILENAME_MAX];
int ct[10];
TIMESTAMP_STRUCT date[10];
t_packet p;
p.h.header.type = type ;
{
switch( type )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -