📄 ui_comms.cpp
字号:
if(!ent)
break;
myx=ent->XPos();
myy=ent->YPos();
ent=session->GetPlayerEntity();
if(ent)
{
sx=ent->XPos();
sy=ent->YPos();
dx=myx-sx;
dy=myy-sy;
dist=static_cast<float>(sqrt(dx*dx+dy*dy) * FT_TO_NM);
if(dist <= 40.0f)
retval=TRUE;
}
break;
case rcfTeam:
if(session->GetTeam() == FalconLocalSession->GetTeam())
retval=TRUE;
break;
case rcfAll:
retval=TRUE;
break;
}
}
return(retval);
}
// This function creates a CHATSTR class... which gets destroyed in ProcessChatStr()
void ReceiveChatString(VU_ID from,_TCHAR *message)
{
CHATSTR *msg;
msg=new CHATSTR;
msg->ID_=from;
msg->Text_=new _TCHAR[_tcsclen(message)];
_tcscpy(msg->Text_,message);
PostMessage(gCommsMgr->AppWnd_,FM_RECEIVE_CHAT,0,(long)msg);
}
// This function is responsible for deleting msg
void ProcessChatStr(CHATSTR *msg)
{
if(!msg)
return;
if(gMainHandler) // Assume UI is running
{
TREELIST *item;
C_Player *plyr;
if(!People)
return;
item=People->Find(msg->ID_.creator_);
if(item)
{
plyr=(C_Player*)item->Item_;
if(plyr && (plyr->GetMute())) // Filter out Chat messages we don't want to hear
return;
}
AddMessageToChatWindow(msg->ID_,msg->Text_);
if(!(gMainHandler->GetWindowFlags(CHAT_WIN) & C_BIT_ENABLED))
gNewMessage=TRUE;
}
else if(VM)// Assume Sim is running (AND VM is initialized)
{
FalconSessionEntity *session;
session=(FalconSessionEntity*)vuDatabase->Find(msg->ID_);
if(session)
{
if(!FilterIncommingMessage(session))
return;
_tcscpy(chatbuf,session->GetPlayerCallsign());
_tcscat(chatbuf,": ");
}
else if (msg->ID_ != FalconNullId)
{
_tcscpy(chatbuf,"Unknown");
_tcscat(chatbuf,": ");
}
else
chatbuf[0] = '\0';
_tcscat(chatbuf,msg->Text_);
OTWDriver.ShowMessage(chatbuf);
}
delete msg;
}
static void SendChatStringCB(long,short hittype,C_Base *control)
{
TREELIST *cur;
C_Player *plyr;
UI_SendChatMessage *chat;
if(hittype != DIK_RETURN || control == NULL || !gCommsMgr->Online())
return;
AddMessageToChatWindow(FalconLocalSessionId,((C_EditBox *)control)->GetText());
cur=People->GetRoot();
while(cur)
{
if(cur->Type_ == C_TYPE_ITEM)
{
plyr=(C_Player*)cur->Item_;
if(plyr && plyr->GetState() && !plyr->GetIgnore())
{
FalconSessionEntity *session = (FalconSessionEntity*) vuDatabase->Find(plyr->GetVUID());
if(session && session != FalconLocalSession)
{
chat=new UI_SendChatMessage(FalconNullId,session);
chat->dataBlock.from=FalconLocalSessionId;
chat->dataBlock.size=static_cast<short>((_tcsclen(((C_EditBox *)control)->GetText())+1)*sizeof(_TCHAR));
chat->dataBlock.message=new _TCHAR[chat->dataBlock.size];
memcpy(chat->dataBlock.message,((C_EditBox *)control)->GetText(),chat->dataBlock.size);
FalconSendMessage(chat,TRUE);
}
}
}
cur=cur->Next;
}
((C_EditBox*)control)->SetText(TXT_SPACE);
control->Refresh();
}
static void SetOnlineStatus(long ID)
{
C_Window *win;
C_Base *ctrl;
win=gMainHandler->FindWindow(ID);
if(win)
{
ctrl=win->FindControl(SINGLE_FLY_CTRL);
if(ctrl)
{
ctrl->Refresh();
if(gCommsMgr->Online())
ctrl->SetReady(0);
else
ctrl->SetReady(1);
ctrl->Refresh();
}
ctrl=win->FindControl(SINGLE_COMMIT_CTRL);
if(ctrl)
{
ctrl->Refresh();
if(gCommsMgr->Online())
ctrl->SetReady(0);
else
ctrl->SetReady(1);
ctrl->Refresh();
}
ctrl=win->FindControl(COMMS_FLY_CTRL);
if(ctrl)
{
ctrl->Refresh();
if(gCommsMgr->Online())
ctrl->SetReady(1);
else
ctrl->SetReady(0);
ctrl->Refresh();
}
ctrl=win->FindControl(COMMS_COMMIT_CTRL);
if(ctrl)
{
ctrl->Refresh();
if(gCommsMgr->Online())
ctrl->SetReady(1);
else
ctrl->SetReady(0);
ctrl->Refresh();
}
ctrl=win->FindControl(DF_OFFLINE_CTRL);
if(ctrl)
{
ctrl->Refresh();
if(gCommsMgr->Online())
ctrl->SetReady(0);
else
ctrl->SetReady(1);
ctrl->Refresh();
}
ctrl=win->FindControl(DF_HOST_CTRL);
if(ctrl)
{
ctrl->Refresh();
if(gCommsMgr->Online())
ctrl->SetReady(1);
else
ctrl->SetReady(0);
ctrl->Refresh();
}
}
#if 0
if(People)
{
if(gCommsMgr->Online())
People->SetReady(1);
else
People->SetReady(0);
if(People->GetParent())
People->GetParent()->RefreshClient(People->GetClient());
}
#endif
}
void SetSingle_Comms_Ctrls()
{
// SetOnlineStatus(IA_TOOLBAR_WIN); // Single player ONLY for Instant Action
SetOnlineStatus(DF_TOOLBAR_WIN);
SetOnlineStatus(DF_PLAY_TOOLBAR_WIN);
SetOnlineStatus(TAC_TOOLBAR_WIN);
SetOnlineStatus(TAC_LOAD_TOOLBAR);
SetOnlineStatus(CP_TOOLBAR);
SetOnlineStatus(CS_TOOLBAR_WIN);
}
static VU_ID SearchID;
static VU_ID *tmpID;
BOOL TreeSearchCB(TREELIST *item)
{
if(item == NULL) return(FALSE);
if(item->Item_ == NULL) return(FALSE);
if(item->Type_ == C_TYPE_ITEM)
{
if(((C_Player*)item->Item_)->GetVUID() == SearchID)
return(TRUE);
}
else if(item->Type_ == C_TYPE_MENU)
{
tmpID=(VU_ID*)item->Item_->GetUserPtr(_UI95_VU_ID_SLOT_);
if(tmpID == NULL)
return(FALSE);
if(*tmpID == SearchID)
return(TRUE);
}
return(FALSE);
}
TREELIST *StartTreeSearch(VU_ID findme,TREELIST *top,C_TreeList *tree)
{
SearchID=findme;
tree->SetSearchCB(TreeSearchCB);
return(tree->SearchWithCB(top));
}
static void UpdatePlayerListCB(short,VU_ID,VU_ID)
{
}
static BOOL TrimmerFindSession(VU_ID playerid,VuGameEntity *game)
{
VuSessionsIterator sessionWalker(game);
FalconSessionEntity *session;
session = (FalconSessionEntity*)sessionWalker.GetFirst();
while(session)
{
if(session->Id() == playerid)
return(TRUE);
session = (FalconSessionEntity*)sessionWalker.GetNext();
}
return(FALSE);
}
static void TrimPlayerTree(C_TreeList *tree,TREELIST *branch)
{
VU_ID *tmpID;
TREELIST *limb;
VuGameEntity *game;
C_Player *plyr;
limb=NULL;
while(branch)
{
if(branch->Type_ == C_TYPE_MENU)
{
tmpID=(VU_ID*)branch->Item_->GetUserPtr(_UI95_VU_ID_SLOT_);
if(tmpID) // this is a game vu_id
{
game=(VuGameEntity*)vuDatabase->Find(*tmpID);
if(game == NULL)
limb=branch;
else if(branch->Child)
TrimPlayerTree(tree,branch->Child);
}
else
TrimPlayerTree(tree,branch->Child);
}
else if(branch->Type_ == C_TYPE_ITEM)
{
tmpID=(VU_ID*)branch->Parent->Item_->GetUserPtr(_UI95_VU_ID_SLOT_);
if(tmpID == NULL)
game=vuPlayerPoolGroup;
else
game=(VuGameEntity*)vuDatabase->Find(*tmpID);
plyr=(C_Player*)branch->Item_;
if(!TrimmerFindSession(plyr->GetVUID(),game))
limb=branch;
}
branch=branch->Next;
if(limb)
{
tree->DeleteItem(limb);
limb=NULL;
}
}
}
static TREELIST *AddGameToList(VuGameEntity *game,TREELIST *parent,C_TreeList *tree)
{
C_Button *btn;
TREELIST *group;
VU_ID *tmpID;
_TCHAR *name;
name=game->GameName();
btn=new C_Button;
btn->Setup(C_DONT_CARE,C_TYPE_CUSTOM,0,0);
btn->SetFlagBitOn(C_BIT_ENABLED);
btn->SetText(C_STATE_0,name);
btn->SetText(C_STATE_1,name);
btn->SetText(C_STATE_2,name);
btn->SetFgColor(C_STATE_0,0x00e0e0e0);
btn->SetFgColor(C_STATE_1,0x0000ff00);
btn->SetFgColor(C_STATE_2,0x0000ffff);
tmpID=new VU_ID;
*tmpID=game->Id();
btn->SetUserCleanupPtr(_UI95_VU_ID_SLOT_,tmpID);
group=tree->CreateItem(gCommsUniqueID++,C_TYPE_MENU,btn);
if(parent)
tree->AddChildItem(parent,group);
else
{
tree->AddItem(tree->GetRoot(),group);
if(FalconLocalGame == game)
btn->SetState(2);
}
if (game == gCommsMgr->GetTargetGame())
btn->Process(0,C_TYPE_LMOUSEUP);
return(group);
}
static TREELIST *CreatePlayerButton(C_TreeList *tree,FalconSessionEntity *session)
{
TREELIST *item;
C_Player *player;
player=new C_Player;
player->Setup(session->Id().creator_,0);
player->InitEntity();
player->SetFont(tree->GetFont());
player->SetIcon(8,8,ICON_IMAGE);
player->SetName(20,0,session->GetPlayerCallsign());
if(session == FalconLocalSession)
player->SetColor(0x0000ffff,0x0000ffff,0x0000ffff);
else
{
player->SetColor(0x00e0e0e0,0x0000ff00,0x0000aa);
player->SetStatus(8,8,MUTE_IMAGE);
}
player->SetVUID(session->Id());
item=tree->CreateItem(session->Id().creator_,C_TYPE_ITEM,player);
return(item);
}
void UpdateGameTreeBranch(long branchid,VuGameEntity *game,C_TreeList *tree,TREELIST *parent,BOOL IsChild) // branchid is the game_<GameType> therefore add 1 for valid ID
{
TREELIST *group,*player;
C_Button *btn;
if(game == NULL)
return;
if(branchid != game_PlayerPool)
{
group=StartTreeSearch(game->Id(),parent,tree);
if(group == NULL)
{
if(IsChild)
group=AddGameToList(game,parent,tree);
else
group=AddGameToList(game,NULL,tree);
}
else
{
btn=(C_Button*)group->Item_;
if(btn)
{
if(strcmp(game->GameName(),btn->GetText(C_STATE_0)))
{
btn->SetText(C_STATE_0,gStringMgr->GetText(gStringMgr->AddText(game->GameName())));
btn->SetText(C_STATE_1,gStringMgr->GetText(gStringMgr->AddText(game->GameName())));
}
}
}
parent=group;
}
VuSessionsIterator sessionWalker(game);
FalconSessionEntity *session;
session = (FalconSessionEntity*)sessionWalker.GetFirst();
while(session)
{
player=StartTreeSearch(session->Id(),parent,tree);
if(player == NULL)
{
player=CreatePlayerButton(tree,session);
tree->AddChildItem(parent,player);
}
session = (FalconSessionEntity*)sessionWalker.GetNext();
}
}
static void RemoveOldPeopleTreeCB(TREELIST *old)
{
_TCHAR buffer[60];
_stprintf(buffer,"%s %s",((C_Player*)old->Item_)->GetName(),gStringMgr->GetString(TXT_LEFT_GAME));
ReceiveChatString(FalconNullId,buffer);
}
// Call this function EVERYTIME we move to a different game
void MakeLocalGameTree(VuGameEntity *game)
{
C_Window *win;
C_Button *btn;
TREELIST *item;
C_Text *txt;
VU_ID *tmpID;
if(!People)
return;
if(People->GetRoot())
People->DeleteBranch(People->GetRoot());
win=gMainHandler->FindWindow(CHAT_WIN);
if(!win)
return;
if(game)
{
txt=new C_Text;
txt->Setup(C_DONT_CARE,0);
txt->SetFGColor(0xeeeeee);
txt->SetFixedWidth(30);
txt->SetFont(People->GetFont());
if(game == (VuGameEntity*)vuPlayerPoolGroup)
{
txt->SetText(TXT_PLAYERPOOL);
win->DisableCluster(1);
win->DisableCluster(2);
win->DisableCluster(3);
win->DisableCluster(4);
win->RefreshWindow();
}
else
{
txt->SetText(game->GameName());
tmpID=new VU_ID;
*tmpID=game->Id();
txt->SetUserCleanupPtr(_UI95_VU_ID_SLOT_,tmpID);
switch(((FalconGameEntity*)game)->GetGameType())
{
case game_Dogfight:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -