📄 menuserver.cpp
字号:
case CMD_PUBLIC_NOTICE_TITLE_REQ: {
//PublicNotice title[10];
int max = GetTitleBBS( count, ct, date, name, title );
for( int i=0; i<max; i++ )
{
// if( !public_notice[i].no ) return;
p.u.server_menu_message_title.no = ct[i];
p.u.server_menu_message_title.date = date[i].year*10000 + date[i].month*100+date[i].day;
strncpy( (char *)p.u.server_menu_message_title.name, name[i], NM_LENGTH-2 );
strncpy( (char *)p.u.server_menu_message_title.title, title[i], NM_LENGTH-2 );
p.h.header.size = sizeof( t_server_menu_message_title );
QueuePacket( c, cn, &p, 1 );
}
break;
}
case CMD_RANK_TITLE_REQ :
case CMD_FORUM_TITLE_REQ :
case CMD_EVENT_TITLE_REQ :
case CMD_MYDIARY_TITLE_REQ :
case CMD_BBS_TITLE_REQ :
case CMD_ETC_TITLE_REQ : ;
}
}
}
void SendCharInfomation( int type, t_connection c[], int cn )
{
t_packet p;
memset( &p, 0, sizeof( t_server_user_db_data ) );
p.h.header.type = type ;
{
PutPacketCharDB( c, cn, &p );
}
p.h.header.size = sizeof(t_server_user_db_data);
QueuePacket( c, cn, &p, 1 );
}
void SendOtherInv( int type, int other_id, t_connection c[], int cn ) // pk 贸府绰?
{
const int GET_ITEM_MAX = 1;
t_packet p;
CHARLIST *ch;
if( other_id < 10000 ) ch = CheckServerId( other_id );
else ch = CheckNpcId( other_id-10000 );
if( !ch ) return;
//soto-tai for( int i=0; i<15; i++ ) p.u.kein.server_other_ch_inv.item[i] = 0;
for( int i=0; i<15; i++ )
{
memset(&p.u.kein.server_other_ch_inv.item[i],0,sizeof(ItemAttr));
}
//soto-tai int item[100];
ItemAttr item[100];memset(item,0,sizeof(ItemAttr)*100);
int ct = 0;
p.h.header.type = type ;
{
for( int a=0; a<3; a++ )
for( int b=0; b<3; b++ )
for( int c=0; c<8; c++ )
{
if( ch->inv[a][b][c].item_no )
{
CItem *t = ItemUnit( ch->inv[a][b][c] );
if( !t ) continue;
if( t->GetLevel() >= 100 ) continue; // 饭骇捞 臭篮 酒捞袍篮 啊廉哎荐 绝霸..
//soto-tai item[ct++] = ch->inv[a][b][c].item_no;
item[ct++] = ch->inv[a][b][c];
if( ct==100 ) goto ok__ ;
}
}
}
ok__ :
int count = 0; // 角龙利栏肺 甸绢哎 拱扒甸 墨款飘
if( ct < GET_ITEM_MAX)
{
for( int i=0; i<ct; i++ )
{
p.u.kein.server_other_ch_inv.item[i] = item[i];
count++;
}
}
else
{
int item_count[GET_ITEM_MAX] = {0,};
while( count < GET_ITEM_MAX )
{
int para = rand() % ct;
int ret = 0;
for( int i=0; i<count; i++ )
{
if( item_count[i] == para )
{
ret = 1;
break;
}
}
if( !ret ) item_count[count++] = para;
}
for( int i=0; i<count; i++ )
{
p.u.kein.server_other_ch_inv.item[i] = item[item_count[i]];
}
}
p.u.kein.server_other_ch_inv.target_id = other_id;
p.u.kein.server_other_ch_inv.item_count = count;
//soto-tai p.h.header.size = sizeof(kein_server_other_ch_inv) - sizeof( short int )*(15-count);
p.h.header.size = sizeof(kein_server_other_ch_inv) - sizeof( ItemAttr )*(15-count);
QueuePacket( c, cn, &p, 1 );
}
int RecvDivideItem( kein_item_attr_pos *item, t_connection c[], int cn )
{
CHARLIST *ch = &c[cn].chrlst;
if( !ch ) return 0;
POS &pos_s = item->item_pos;
int &much = item->much;
if( !much ) return OK; // 蔼捞 绝阑 版快绰 弊成 府畔~
ItemAttr *source = GetItemByPOS( cn, pos_s );
if( !source ) return NOT;
ItemAttr temp = *source; // 瘤况瘤绰 酒捞袍 锅龋客 加己父 啊瘤绊 乐绰促.
if( source->item_no != item->item_attr.item_no ) return NOT;
if( source->attr[IATTR_MUCH] > MAX_MONEY ) source->attr[IATTR_MUCH] = MAX_MONEY; // 唱喘荐 乐绰 酒捞袍篮 100000阑 逞瘤 给茄促.
if( source->attr[IATTR_MUCH] > (DWORD) much )
{
source->attr[IATTR_MUCH] -= much;
}
else
{
much = source->attr[IATTR_MUCH];
DeleteItem( source );
// SendDeleteItem( pos_s, c, cn ); // 酒捞袍 昏力 傈价 窃荐
}
int x, y, z;
if( !SearchInv( ch->inv, x, y, z ) )
{
ItemAttr target = temp;
target.attr[IATTR_MUCH] = much;
if( target.item_no == IN_COINS && much <= 5 ) target.item_no = IN_COIN;
else if( target.item_no == IN_COIN && much > 5 ) target.item_no = IN_COINS;
if( target.item_no == IN_NEW_COINS && much <= 5 ) target.item_no = IN_NEW_COIN;
else if( target.item_no == IN_NEW_COIN && much > 5 ) target.item_no = IN_NEW_COINS;
SendItemEventLog( &target, ch->GetServerID(), ch->GetServerID(), SILT_PUT_GROUND_MAX_INVEN, 1 ); //YGI acer
DropItem( ch->X, ch->Y, &target ); // 顶官蹿栏肺 冻绢哆赴促.
}
else
{
ItemAttr &target = ch->inv[x][y][z];
target = temp; // 酒捞袍 锅龋客 老馆 加己 逞败 林扁 困秦
target.attr[IATTR_MUCH] = much;
if( target.item_no == IN_COINS && much <= 5 ) target.item_no = IN_COIN;
else if( target.item_no == IN_COIN && much > 5 ) target.item_no = IN_COINS;
if( target.item_no == IN_NEW_COINS && much <= 5 ) target.item_no = IN_NEW_COIN;
else if( target.item_no == IN_NEW_COIN && much > 5 ) target.item_no = IN_NEW_COINS;
POS pos;
SetItemPos( INV, x, y, z, &pos );
SendServerEachItem( &pos, &target, cn );
}
//020303 lsw
/* if( pos_s.type == BOX )
{
SendLoginPutBoxItem( ch->box_id, pos_s.p3, source );
}
*/
return 1;
}
void RecvBankInfoDeposit( DWORD dwMoney, t_connection c[], int cn )
{
CHARLIST *ch = ::CheckServerId( cn );
if( !ch )
{
return;
}
const DWORD dwBankMoney = ch->GetBankMoney();
if(MAX_BANK_MONEY <= dwBankMoney)
{//抗陛咀篮 40撅捞 弥措 涝聪促.
OutMessage(ch,2,930);
}
if(1==::SubtractMoney( dwMoney, ch )) //傈价罐篮 涝仿 抗陛阑 歹茄促.
{
::SendSubtractMoney( dwMoney, cn ); // 盎脚等 沥焊甫 焊郴霖促.
ch->IncBankMoney(dwMoney, BMCT_BANK_DEPOSIT); // CSD-030723
}
}
void RecvBankInfoDefrayal( DWORD dwMoney, t_connection c[], int cn )
{
CHARLIST *ch = CheckServerId( cn );
if( !ch ) return;
if( ch->GetBankMoney() >= dwMoney )//篮青俊 捣篮 乐绰啊
{
if(::GiveMoneyAble(ch,dwMoney))//捣阑 罐阑 荐 乐绰 惑炔牢啊
{
ch->DecBankMoney(dwMoney, BMCT_BANK_DEFRAYAL); // CSD-030723
GiveMoney(ch,dwMoney);
}
}
}
void SendBankRepayment( t_connection c[], int cn )
{
CHARLIST *ch = CheckServerId( cn );
if( !ch ) return;
t_packet p;
p.h.header.type = REP_YOUR_DEPOSIT_INFO;
{
p.u.kein.client_bank_repayment.loan_money;
p.u.kein.client_bank_repayment.last_loan;
p.u.kein.client_bank_repayment.last_loan_time;
}
p.h.header.size = sizeof( k_client_bank_deposit );
QueuePacket( c, cn, &p, 1 );
}
void RecvCharInfoBasic( t_char_info_basic *p, t_connection c[], int cn )
{
if( p->kind < 0 ) return;
if( p->password != 111 ) return;
CHARLIST *ch = &c[cn].chrlst;
if( !ch ) return;
if( strcmp( g_szPassWordName, ch->Name ) ) return;
DWORD d = p->data;
switch (p->kind)
{ //< CSD-030723
case STR:
{
ch->Str = short(d);
break;
}
case DEX:
{
ch->Dex = short(d);
break;
}
case CON:
{
ch->Con = short(d);
break;
}
case WIS:
{
ch->Wis = short(d);
break;
}
case INT_:
{
ch->Int = short(d);
break;
}
case MOVP:
{
ch->MoveP = short(d);
break;
}
case CHA:
{
ch->Char = short(d);
break;
}
case ENDU:
{
ch->Endu = short(d);
break;
}
case MOR:
{
ch->Moral = short(d);
break;
}
case LUCK:
{
ch->Luck = short(d);
break;
}
case WSPS:
{
ch->wsps = short(d);
break;
}
case LVPOINT:
{
ch->SetReservedPoint(d);
break;
}
case MONEY:
{
ch->Money = d;
break;
}
case HP:
{
ch->Hp = d;
break;
}
case MAX_HP:
{
ch->HpMax = d;
break;
}
case MP:
{
ch->Mana = d;
break;
}
case MAX_MP:
{
ch->ManaMax = d;
break;
}
case SP:
{
ch->Hungry = d;
break;
}
case MAX_SP:
{
ch->HungryMax = d;
break;
}
case BANKMONEY:
{
ch->SetBankMoney(d, BMCT_RECV_CHAR_INFO_BASIC);
break;
}
case TAC_E1:
case TAC_E2:
case TAC_E3:
case TAC_E4:
case TAC_E5:
case TAC_E6:
case TAC_E7:
case TAC_E8:
case TAC_E9:
case TAC_E10:
case TAC_E11:
case TAC_E12:
case TAC_E13:
{
ch->ConvertTacticsLevel(p->kind- TAC_E1);
break;
}
} //> CSD-030723
}
void SendStoreItemList( int cn, int storelistindex, int menu )
{
t_packet p;
int count = 0;
p.h.header.type = CMD_STORE_ITEMLIST;
{
p.u.server_store_itemlist.no = storelistmax[ storelistindex];
p.u.server_store_itemlist.smallmenu = menu;
p.u.server_store_itemlist.storelistindex = storelistindex;
for( int i = 0 ; i < storelistmax[ storelistindex] ; i ++)
{
if( storelist_attr[ storelistindex][ i] == SIT_EVENT_ITEM ||
storelist_attr[ storelistindex][ i] == SIT_NULL ) continue;
switch( menu )
{
case MN_SKILLGUILD_REPAIR : break;
case MN_SKILLGUILD_SELL :
case MN_SHOP_SELL : if( storelist_attr[ storelistindex][ i] == SIT_ONLY_SELL ) continue;
break;
case MN_SKILLGUILD_BUY :
case MN_SHOP_BUY : if( storelist_attr[ storelistindex][ i] == SIT_ONLY_BUY ) continue;
break;
default : break;
}
p.u.server_store_itemlist.store_item[count++].item = storelist[ storelistindex][ i].item_no;
}
}
p.h.header.size = sizeof( t_server_store_itemlist ) - sizeof( k_store_list_item )*(MAX_STORE_ITEM_LIST-count) ;
QueuePacket(connections, cn, &p, 1);
}
void SendCallSmallMenu( int cn, int storelistindex, int menu )
{
t_packet p;
p.h.header.type = CMD_CALL_SMALLMENU;
{
p.u.server_call_smallmenu.menu = menu;
p.u.server_call_smallmenu.storelistindex = storelistindex;
}
p.h.header.size = sizeof( t_server_call_smallmenu );
QueuePacket(connections, cn, &p, 1);
}
//<soto-030421
void SendCallDualMagicLearnMenu( int cn)
{
t_packet p;
p.h.header.type = CMD_DUAL_MAGIC_LEARN_BOOK;
p.h.header.size = 0;
QueuePacket(connections, cn, &p, 1);
}
//>soto-030421
//<soto-030429
void RecvCallLuckyMenuOpen(int cn)
{
SendCallLuckyMenuOpen(cn);
}
void SendCallLuckyMenuOpen(int cn)
{
t_packet p;
p.h.header.type = CMD_OPEN_LUCKY_MENU;
p.h.header.size = 0;
QueuePacket(connections, cn, &p, 1);
}
int LoadGuildItem( char *filename, int num )
{
FILE *fp;
fp = fopen( filename, "rt" );
if( fp == NULL ) return 0;
char buf[MAX_STRING];
int i=0;
while( !feof(fp) )
{
fgets(buf, BBS_STRING_MAX, fp);
if( *buf == ';' ) continue;
char *token;
// token = strtok(buf, "\t\n\r"); // number skip
// if( token == NULL ) break;
token = strtok(buf, "\t\n\r");
// token = strtok(NULL, "\t\n\r"); // 酒捞袍 锅龋
if( token == NULL ) break;
storelist[num][i].item_no = atoi( token )/100;
storelist[num][i] = GenerateItem( storelist[num][i].item_no ); // 惑痢篮 叼弃飘 酒捞袍捞 父甸绢 柳促.
token = strtok(NULL, "\t\n\r"); // 酒捞袍 捞抚 skip
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -