53 : iByClient(::
Control.ClientID())
104 LogF(
"C4Control::PreExecute: WARNING: Ignoring packet type %2x (not control.)", pPkt->getPktType());
123 LogF(
"C4Control::Execute: WARNING: Ignoring packet type %2x (not control.)", pPkt->getPktType());
134 pCtrlPkt->
PreRec(pRecord);
175 LogF(
"Debug mode forced disabled by %s", client ? client->
getName() :
"<unknown client>");
186 Log(
"/set maxplayer disabled in league!");
249 bool is_local_script =
true;
258 is_local_script =
false;
262 LogF(
" = %s (by %s)", rVal.GetDataString().getData(), pClient->
getName());
264 LogF(
" = %s (by client %d)", rVal.GetDataString().getData(),
iByClient);
267 LogF(
" = %s", rVal.GetDataString().getData());
271 C4Object *returned_object = rVal.getObj();
299 if (!target_player)
return;
331 script.Replace(
"%player%",
FormatString(
"%d", player).getData());
336 escaped_param.EscapeString();
337 script.Replace(
"%s", escaped_param.getData());
359 : iPlr(iPlr), fIsAlt(fIsAlt), iObjCnt(Objs.ObjectCount())
376 int32_t iControlChecksum = 0;
377 for (int32_t i = 0; i <
iObjCnt; i++)
380 iControlChecksum += pObj->
Number * (iControlChecksum+4787821);
423 pTargetCtrl = &(pPlr->
Control);
448 assert(
player !=
nullptr);
449 if (!
player)
return nullptr;
452 control->action = CPM_Hover;
453 control->player =
player->Number;
454 control->drag_obj = drag ? drag->
Number : 0;
455 control->target_obj = target ? target->
Number : 0;
456 control->old_obj = old_target ? old_target->
Number : 0;
461 assert(
player !=
nullptr);
462 if (!
player)
return nullptr;
465 control->action = CPM_Drop;
466 control->player =
player->Number;
467 control->drag_obj = drag ? drag->
Number : 0;
468 control->target_obj = target ? target->
Number : 0;
474 const char *callback_name =
nullptr;
499 if (!callback_name)
return;
515 : actionID(actionID),
player(
player), menuID(menuID), subwindowID(subwindowID), target(target ? target->Number : 0), actionType(actionType)
526 Log(
"Warning: invalid action type for C4ControlMenuCommand!");
535 if (
target && !obj)
return;
577 control->target = goal->
Number;
594 control->param_int = hostile;
602 control->target = team;
610 control->target = team;
620 control->param_str = ctrl_set->
GetName();
622 control->param_int |= CPA_IPC_HasKeyboard;
624 control->param_int |= CPA_IPC_HasMouse;
626 control->param_int |= CPA_IPC_HasGamepad;
635 if (!source_player)
return;
654 goal->
Call(
"Activate", &pars);
667 if (!target_player)
return;
708 pars[2] =
C4VBool(CPA_IPC_HasKeyboard == (param_int & CPA_IPC_HasKeyboard));
709 pars[3] =
C4VBool(CPA_IPC_HasMouse == (param_int & CPA_IPC_HasMouse));
710 pars[4] =
C4VBool(CPA_IPC_HasGamepad == (param_int & CPA_IPC_HasGamepad));
794 {
const char *szTemp = szThis; szThis = szOther; szOther = szTemp; }
796 LogFatal(
"Network: Synchronization loss!");
797 LogFatal(
FormatString(
"Network: %s Frm %i Ctrl %i Rnc %i Cpx %i PXS %i MMi %i Obc %i Oei %i Sct %i", szThis,
Frame,
ControlTick,
RandomCount,
AllCrewPosX,
PXSCount,
MassMoverIndex,
ObjectCount,
ObjectEnumerationIndex,
SectShapeSum).getData());
798 LogFatal(
FormatString(
"Network: %s Frm %i Ctrl %i Rnc %i Cpx %i PXS %i MMi %i Obc %i Oei %i Sct %i", szOther, SyncCheck.Frame,SyncCheck.ControlTick,SyncCheck.RandomCount,SyncCheck.AllCrewPosX,SyncCheck.PXSCount,SyncCheck.MassMoverIndex,SyncCheck.ObjectCount,SyncCheck.ObjectEnumerationIndex, SyncCheck.SectShapeSum).
getData());
856 if (!pClient)
return;
880 if (!pClient)
return;
915 time_t last_change_time = MinReadyAnnouncementDelay;
918 if (last_change_time >= MinReadyAnnouncementDelay)
1004 : Filename(szFilename, true), iAtClient(iAtClient),
1005 idInfo(iIDInfo), fByRes(true), ResCore(
std::move(ResCore))
1010 : Filename(szFilename, true), iAtClient(iAtClient),
1017 bool file_is_temp =
false;
1026 filename.
Take(filename_buf);
1027 file_is_temp =
true;
1032 LogF(
"[!]Error packing player file %s to %s for join: Pack failed.", filename.
getData(), filename_buf.
getData());
1039 LogF(
"[!]Error loading player file from %s.", filename.
getData());
1046 LogF(
"[!]Error loading player file from %s.", szFilename);
1063 LogF(
"ERROR: Ghost player join: No info for %d",
idInfo);
1093 LogF(
"ERROR: Ghost player join: No player data for %s", (
const char*)pInfo->
GetName());
1135 size_t iBigIconSize=0;
1144 PlrData = std::move(NewPlrData);
1153 if (!
fByRes)
return true;
1162 if (!pRes)
return true;
1169 if (!pRecord)
return;
1207 int32_t iObjectNum, int32_t *pObjects,
const char *szScript,
bool drag_finished)
1208 : eAction(eAction), tx(tx), ty(ty), iTargetObj(pTargetObj ? pTargetObj->Number : 0),
1209 iObjectNum(iObjectNum), pObjects(pObjects), StringParam(szScript, true), drag_finished(drag_finished)
1216 #ifdef WITH_QT_EDITOR
1220 ctl->StringParam =
id.ToString();
1229 void C4ControlEMMoveObject::MoveObject(
C4Object *moved_object,
bool move_forced)
const
1232 if (!moved_object || !moved_object->
Status)
return;
1233 int32_t old_x = moved_object->
GetX(), old_y = moved_object->
GetY();
1237 moved_object->
xdir = moved_object->
ydir = 0;
1238 moved_object->
Mobile =
false;
1283 pObj->
Enter(pTarget);
1284 if (!pTarget->
Status)
break;
1287 if (!pTarget->
Status)
break;
1307 ScriptCtrl.SetTargetObj(
pObjects[i]);
1308 ScriptCtrl.Execute();
1339 if (placement_limit)
1354 if (!container || !container->
Status)
return;
1356 bool create_centered =
false;
1357 #ifdef WITH_QT_EDITOR
1359 create_centered =
true;
1362 if (container && obj && container->
Status && obj->
Status)
1364 obj->
Enter(container);
1376 int32_t new_rot =
fixtoi(this->tx, 1);
1407 int32_t iX, int32_t iY, int32_t iX2, int32_t iY2, int32_t iGrade,
1408 const char *szMaterial,
const char *szTexture,
const char *szBackMaterial,
const char *szBackTexture)
1409 : eAction(eAction), iMode(iMode), iX(iX), iY(iY), iX2(iX2), iY2(iY2), iGrade(iGrade),
1410 Material(szMaterial, true), Texture(szTexture, true),
1411 BackMaterial(szBackMaterial, true), BackTexture(szBackTexture, true)
1452 for (
int cnt=0; cnt<
iGrade; cnt++)
1510 pClient ? pClient->
getNick() :
"???", szMessage);
1524 if (pPlr && pPlr->
Cursor)
1530 if (!dwClr) dwClr = 0xff;
1600 LogF(
"Network: %s", szMessage);
1682 Action =
LoadResStr(
"IDS_VOTE_CANCELTHEROUND");
break;
1685 Action =
LoadResStr(
"IDS_VOTE_LEAVETHEGAME");
1694 Action =
LoadResStr(
"IDS_TEXT_PAUSETHEGAME");
1696 Action =
LoadResStr(
"IDS_TEXT_UNPAUSETHEGAME");
1699 Action =
"perform some mysterious action";
break;
1710 Warning =
LoadResStr(
"IDS_TEXT_WARNINGIFTHEGAMEISCANCELL");
break;
1712 Warning =
LoadResStr(
"IDS_TEXT_WARNINGNOLEAGUEPOINTSWILL");
break;
1714 Warning =
"";
break;
1734 int32_t iPositive = 0, iNegative = 0, iVotes = 0;
1741 int32_t iPositiveTeam = 0, iNegativeTeam = 0, iVotesTeam = 0;
1750 if (!pNfo)
continue;
1756 if (!pNfo)
continue;
1758 if (iClientID < 0)
continue;
1781 if (iPositiveTeam * 2 > iVotesTeam)
1784 else if (iNegativeTeam * 2 >= iVotesTeam)
1789 if (iPositive * 2 > iVotes)
1794 else if (iNegative * 2 >= iVotes)
1835 for (iInfo = 0; (pInfo = pInfos->
GetPlayerInfo(iInfo)); iInfo++)
1846 for (iInfo = 0; (pInfo = pInfos->
GetPlayerInfo(iInfo)); iInfo++)
1884 char *tmp_fn =
const_cast<char *
>(
Config.
AtTempPath(
"ReinitSectionSave.ocs"));
1887 grp.
Open(tmp_fn,
true);
1889 bool success =
true;
1891 for (
const char *section_component : section_components)
1895 if (!grp.
Add(section_component, buf,
false,
true)) success =
false;
1899 if (!grp.
Save(
false)) success =
false;
1900 if (!success)
return;
1904 if (!success)
return;
1921 const char *reinit_section_name =
"EditorReloadSection";
const int32_t C4ClientIDHost
const int32_t C4ClientIDUnknown
#define C4CFN_ScenarioObjectsScript
#define C4CFN_ScenarioObjects
#define C4CFN_ScenarioCore
const int C4MaxControlRate
const int32_t C4D_MouseSelect
C4Def * C4Id2Def(C4ID id)
void GameMsgObjectDw(const char *szText, C4Object *pTarget, uint32_t dwClr)
#define PSF_MouseSelectionAlt
#define PSF_InitializePlayerControl
#define PSF_InputCallback
#define PSF_MouseSelection
#define PSF_EditCursorMoved
#define PSF_MouseDragDrop
C4AulScriptEngine ScriptEngine
C4Application Application
C4GraphicsSystem GraphicsSystem
bool C4Group_PackDirectoryTo(const char *filename, const char *to_filename)
bool C4Group_CopyItem(const char *source, const char *target, bool no_sorting, bool reset_attributes)
const char * LoadResStr(const char *id)
bool Log(const char *szMessage)
bool LogF(const char *strMessage,...)
bool LogFatal(const char *szMessage)
C4MaterialMap MaterialMap
bool MatValid(int32_t mat)
const int32_t C4NetResMaxBigicon
C4NetFilenameAdapt mkNetFilenameAdapt(StdStrBuf &FileName)
int32_t Hostile(int32_t plr1, int32_t plr2)
int fixtoi(const C4Fixed &x)
#define C4S_REINIT_SCENARIO
C4GameScriptHost GameScript
C4SoundInstance * StartSoundEffect(const char *szSndName, bool fLoop, int32_t iVolume, C4Object *pObj, int32_t iCustomFalloffDistance, int32_t iPitch, C4SoundModifier *modifier)
C4Value C4VObj(C4Object *pObj)
C4Value C4VInt(int32_t i)
C4Value C4VString(C4String *pStr)
StdSTLContainerAdapt< C > mkSTLContainerAdapt(C &rTarget, StdCompiler::Sep eSep=StdCompiler::SEP_SEP)
StdArrayAdapt< T > mkArrayAdapt(T *pArray, int iSize)
StdIntPackAdapt< T > mkIntPackAdapt(T &rVal)
StdIntAdapt< T > mkIntAdapt(T &rValue)
StdNamingAdapt< T > mkNamingAdapt(T &&rValue, const char *szName)
StdStrBuf FormatString(const char *szFmt,...)
bool DirectoryExists(const char *szFilename)
const char * GetFilenameOnly(const char *strFilename)
void MakeTempFilename(char *szFilename)
char * GetFilename(char *szPath)
bool EraseFile(const char *szFileName)
void NotifyUserIfInactive()
void ControlScriptEvaluated(const char *script, const char *result)
static C4AulDebug * GetDebugger()
C4AulScriptContext * GetContext(int iLevel)
C4Value DirectExec(C4PropList *p, const char *szScript, const char *szContext, bool fPassErrors=false, C4AulScriptContext *context=nullptr, bool parse_function=false)
int GetContextDepth() const
C4PropListStatic * GetPropList()
const char * getName() const
const char * getNick() const
bool isLobbyReady() const
void SetLobbyReady(bool fnLobbyReady, time_t *time_since_last_change=nullptr)
const char * getName() const
void SetActivated(bool fnActivated)
bool Remove(C4Client *pClient, bool fTemporary=false)
C4Client * getClientByID(int32_t iID) const
void CtrlRemove(const C4Client *pClient, const char *szReason)
void Add(C4Client *pClient)
int32_t getLocalID() const
C4PlayerInfo * GetPlayerInfo(int32_t iIndex) const
const char * AtExePath(const char *filename)
const char * AtTempPath(const char *filename)
void EditGraphControl(const class C4ControlEditGraph *control)
bool Message(const char *szMessage, bool fQuery=false)
C4ControlClientUpdType eType
static C4ControlEMMoveObject * CreateObject(const C4ID &id, C4Real x, C4Real y, C4Object *container)
~C4ControlEMMoveObject() override
C4ControlEMObjectAction eAction
void PreRec(C4Record *pRecord) const
C4IDPacket * firstPkt() const
void CompileFunc(StdCompiler *pComp) override
void Add(C4PacketType eType, C4ControlPacket *pCtrl)
C4IDPacket * nextPkt(C4IDPacket *pPkt) const
C4ControlMenuCommand()=default
C4ControlMessageType eType
virtual void PreRec(C4Record *pRecord)
void CompileFunc(StdCompiler *pComp) override
bool LocalControl() const
virtual bool PreExecute() const
virtual void Execute() const =0
~C4ControlPacket() override
void SetByClient(int32_t iByClient)
static C4ControlPlayerAction * InitScenarioPlayer(const C4Player *source, int32_t team)
C4ControlPlayerAction(const C4Player *source=nullptr)
static C4ControlPlayerAction * SetHostility(const C4Player *source, const C4Player *target, bool hostile)
static C4ControlPlayerAction * InitPlayerControl(const C4Player *source, const C4PlayerControlAssignmentSet *ctrl_set=nullptr)
static C4ControlPlayerAction * Eliminate(const C4Player *source)
static C4ControlPlayerAction * ActivateGoal(const C4Player *source, const C4Object *target)
static C4ControlPlayerAction * SetTeam(const C4Player *source, int32_t team)
static C4ControlPlayerAction * ActivateGoalMenu(const C4Player *source)
static C4ControlPlayerAction * Surrender(const C4Player *source)
ControlItemVec ControlItems
std::vector< ControlItem > ControlItemVec
C4ClientPlayerInfos PlrInfo
static C4ControlPlayerMouse * Hover(const C4Player *player, const C4Object *target, const C4Object *old_target, const C4Object *drag=nullptr)
static C4ControlPlayerMouse * DragDrop(const C4Player *player, const C4Object *target, const C4Object *drag)
C4ControlPlayerSelect()=default
bool fUseVarsFromCallerContext
bool editor_select_result
static int32_t GetAllCrewPosX()
int32_t ObjectEnumerationIndex
C4ControlVoteType getType() const
StdStrBuf getDesc() const
StdStrBuf getDescWarning() const
void AddToSelection(C4PropList *add_obj)
void PerformDuplication(int32_t *object_numbers, int32_t object_count, bool local_call)
void OnSelectionChanged(bool by_objectlist=false)
void ClearSelection(C4PropList *next_selection=nullptr)
void InvalidateSelection()
C4ControlSyncCheck * GetSyncCheck(int32_t iTick)
void DoInput(C4PacketType eCtrlType, C4ControlPacket *pPkt, C4ControlDeliveryType eDelivery)
void SetActivated(bool fActivated)
C4RoundResults & RoundResults
bool LoadScenarioSection(const char *section_name, DWORD flags)
C4Player * JoinPlayer(const char *filename, int32_t at_client, const char *at_client_name, C4PlayerInfo *info)
std::unique_ptr< C4ScriptGuiWindow > ScriptGuiRoot
void Abort(bool fApproved=false)
bool CreateSectionFromTempFile(const char *section_name, const char *temp_filename)
void OnPlayerJoinFinished()
char ScenarioFilename[_MAX_PATH_LEN]
C4PlayerInfoList & PlayerInfos
int32_t ObjectCount(C4ID id)
C4GameParameters & Parameters
void Synchronize(bool save_player_files)
C4Object * CreateObject(C4PropList *type, C4Object *creator, int32_t owner=NO_OWNER, int32_t x=50, int32_t y=50, int32_t r=0, bool grow_from_center=false, C4Real xdir=Fix0, C4Real ydir=Fix0, C4Real rdir=Fix0, int32_t controller=NO_OWNER)
void OnClientPart(C4Client *pPartClient)
void OnClientJoin(C4Client *pNewClient)
void OnClientSound(C4Client *pOfClient)
bool OnMessage(C4Client *pOfClient, const char *szMessage)
void OnClientReadyStateChange()
C4Object * ObjectPointer(int32_t object_number)
C4Object * SafeObjectPointer(int32_t object_number)
C4Value Call(const char *szFunction, C4AulParSet *pPars=nullptr, bool fPassError=false)
void DeactivateDebugOutput()
void FlashMessage(const char *message)
bool Add(const char *filename, const char *entry_name)
bool LoadEntry(const char *entry_name, char **buffer, size_t *size_info=nullptr, int zeros_to_append=0)
bool Delete(const char *files, bool recursive=false)
bool FindEntry(const char *wildcard, StdStrBuf *filename=nullptr, size_t *size=nullptr)
bool Open(const char *group_name, bool do_create=false)
C4PacketBase * getPkt() const
bool DrawBox(int32_t iX1, int32_t iY1, int32_t iX2, int32_t iY2, int32_t iGrade, const char *szMaterial, const char *szTexture, const char *szBackMaterial, const char *szBackTexture)
LandscapeMode GetMode() const
bool DrawLine(int32_t iX1, int32_t iY1, int32_t iX2, int32_t iY2, int32_t iGrade, const char *szMaterial, const char *szTexture, const char *szBackMaterial, const char *szBackTexture)
bool InsertMaterial(int32_t mat, int32_t *tx, int32_t *ty, int32_t vx=0, int32_t vy=0, bool query_only=false)
bool DrawBrush(int32_t iX, int32_t iY, int32_t iGrade, const char *szMaterial, const char *szTexture, const char *szBackMaterial, const char *szBackTexture)
bool ActivateGoals(int32_t iPlayer, bool fDoActivate)
int32_t Get(const char *szMaterial)
char Script[_MAX_FNAME_LEN+30]
const char * getName() const
void OnSound(class C4Client *singer)
static C4Network2ClientListDlg * GetInstance()
C4Network2Client * GetClientByID(int32_t iID) const
C4Network2Client * GetLocal() const
C4Network2Players Players
C4Network2ResList ResList
class C4GameLobby::MainDlg * GetLobby() const
void EndVote(C4ControlVoteType eType, bool fApprove, int32_t iData)
C4Network2ClientList Clients
void LeagueNotifyDisconnect(int32_t iClientID, enum C4LeagueDisconnectReason eReason)
void AddVote(const C4ControlVote &Vote)
C4IDPacket * GetVote(int32_t iClientID, C4ControlVoteType eType, int32_t iData)
void OnClientPart(class C4Client *pPartClient)
void HandlePlayerInfo(const class C4ClientPlayerInfos &rInfoPacket)
const char * getFileName() const
const char * getFile() const
C4Network2Res::Ref getRefRes(int32_t iResID)
void RemoveAtClient(int32_t iClientID)
C4Network2Res::Ref AddByCore(const C4Network2ResCore &Core, bool fLoad=true)
bool Enter(C4Object *pTarget, bool fCalls=true, bool fCopyMotion=true, bool *pfRejectCollect=nullptr)
int32_t GetProcedure() const
void ForcePosition(C4Real target_x, C4Real target_y)
void DoCon(int32_t iChange, bool grow_from_center)
void AssignRemoval(bool exit_contents=false)
bool Exit(int32_t iX=0, int32_t iY=0, int32_t iR=0, C4Real iXDir=Fix0, C4Real iYDir=Fix0, C4Real iRDir=Fix0, bool fCalls=true)
void SetRotation(int32_t nr)
int ObjectCount(C4ID id=C4ID::None) const
const char * GetName() const
void ExecuteControlPacket(const class C4ControlPlayerControl *pCtrl)
void CountControl(ControlType eType, int32_t iID, int32_t iCntAdd=1)
const char * GetName() const
bool RemoveMessageBoardQuery(C4Object *pForObj)
const char * GetName() const
C4PlayerType GetType() const
C4ClientPlayerInfos * GetInfoByClientID(int32_t iClientID) const
C4ClientPlayerInfos * GetIndexedInfo(int32_t iIndex) const
C4PlayerInfo * GetPlayerInfoByIndex(int32_t index) const
bool HasSameTeamPlayers(int32_t iClient1, int32_t iClient2) const
bool LocalJoinUnjoinedPlayersInQueue()
C4ClientPlayerInfos * GetClientInfoByPlayerID(int32_t id) const
C4PlayerInfo * GetPlayerInfoByID(int32_t id) const
C4ClientPlayerInfos * AddInfo(C4ClientPlayerInfos *pNewClientInfo)
int32_t GetPlayerCount() const
bool Remove(int iPlayer, bool fDisonnected, bool fNoCalls)
C4Player * Get(int iPlayer) const
bool RemoveAtClient(int iClient, bool fDisconnect)
C4Player * GetLocalByIndex(int iIndex) const
int32_t GetPropertyInt(C4PropertyName k, int32_t default_val=0) const
virtual const char * GetName() const
C4Value Call(C4PropertyName k, C4AulParSet *pPars=nullptr, bool fPassErrors=false)
static int32_t GetEnumerationIndex()
bool AddFile(const char *szLocalFilename, const char *szAddAs, bool fDelete=false)
bool LocateItem(const char *filename, StdStrBuf &str) const
void EvaluateNetwork(NetResult eResult, const char *szResultsString)
bool ExecuteCommand(int32_t actionID, int32_t player, int32_t subwindowID, int32_t actionType, C4Object *target)
int32_t GetIndexedPlayer(int32_t iIndex) const
int32_t GetPlayerCount() const
C4Team * GetTeamByIndex(int32_t iIndex) const
C4Team * GetTeamByID(int32_t iID) const
void SetTeamDistribution(TeamDist eToVal)
void SetTeamColors(bool fEnabled)
int32_t GetTeamCount() const
bool IsTeamSwitchAllowed() const
C4PropList * getPropList() const
bool SaveToFile(const char *szFile) const
bool LoadFromFile(const char *szFile)
virtual bool Separator(Sep eSep=SEP_SEP)
void Value(const T &rStruct)
virtual bool isDeserializer()
const char * getData() const
void Format(const char *szFmt,...) GNUC_FORMAT_ATTRIBUTE_O
void GUISound(const char *szSound)
DECLARE_C4CONTROL_VIRTUALS bool PreExecute() const override
C4ControlJoinPlayer()=default
void PreRec(C4Record *pRecord) override
C4Network2ResCore ResCore
void CompileFunc(StdCompiler *pComp)
C4ControlReInitScenario()