scripts.dll komplimieren
-
Vorne weg: Ich bin leider ein ziehmlicher neuling auf dem C++ gebiet
Ich erhalte einen Error7Warning beim komplimieren.
1>.\gmmain.cpp(651) : error C2220: Warnung wird als Fehler interpretiert, es wurde keine object-Datei generiert.
1>.\gmmain.cpp(651) : warning C4018: '<': Konflikt zwischen 'signed' und 'unsigned'bool IsRTC = false; int idrtc = 0; struct swapped { std::string SwappedPlayerName; }; std::vector<swapped> SwappedPlayers; bool SwapCheck(int ID) { for (int i = 0; i < SwappedPlayers.size(); i++) { if (SwappedPlayers[i].SwappedPlayerName == Get_Player_Name_By_ID(ID)) { return true; } } return false; } void SwapAddPlayer(int ID) { if (SwapCheck(ID) == false) { swapped temp; temp.SwappedPlayerName = Get_Player_Name_By_ID(ID); SwappedPlayers.push_back(temp); } } void SwapClearPlayers() { SwappedPlayers.erase(SwappedPlayers.begin(), SwappedPlayers.end()); } void RequestTeamChange(const char *Name) { GameObject *Player = Get_GameObj_By_Player_Name(Name); int ID = Get_Player_ID(Player); int GDIPlayers = Get_Team_Player_Count(0); int NodPlayers = Get_Team_Player_Count(1); if (!IsRTC) { if (GDIPlayers > 0 && NodPlayers > 0) { GameObject *rtccontroller = Commands->Create_Object("Invisible_Object",Vector3(0.0f,0.0f,20.0f)); idrtc = ID; Commands->Attach_Script(rtccontroller,"RTC_timer",""); Console_Input(StrFormat("msg %s has requested to change teams. Type !rtc if you would like to change teams.",Name).c_str()); IsRTC = true; } else { Console_Input(StrFormat("ppage %d There are not enough players for you to request a team change.",ID).c_str()); } } else if (IsRTC) { GameObject *obj = Get_GameObj(idrtc); if (!obj) { GameObject *rtccontroller = Commands->Create_Object("Invisible_Object",Vector3(0.0f,0.0f,20.0f)); idrtc = ID; Commands->Attach_Script(rtccontroller,"RTC_timer",""); Console_Input(StrFormat("msg %s has requested to change teams. Type !rtc if you would like to change teams.",Name).c_str()); } else { if (Get_Team(ID) != Get_Team(idrtc)) { Console_Input(StrFormat("team2 %d %i",ID,Get_Team(idrtc)).c_str()); SwapAddPlayer(ID); Console_Input(StrFormat("team2 %d %i",idrtc,Commands->Get_Player_Type(Player)).c_str()); SwapAddPlayer(idrtc); Console_Input(StrFormat("msg %s and %s have changed teams! The !rtc command is up for new request.",Name,Get_Player_Name_By_ID(idrtc)).c_str()); Console_Input("player_info"); GameObject *timerthing = Find_Object_With_Script("RTC_timer"); Remove_Script(timerthing,"RTC_timer"); Commands->Destroy_Object(timerthing); IsRTC = false; idrtc = 0; } else if (ID == idrtc) { Console_Input(StrFormat("msg %s has revoked their !rtc request. The !rtc command is up for new request.",Get_Player_Name_By_ID(idrtc)).c_str()); GameObject *timerthing = Find_Object_With_Script("RTC_timer"); Remove_Script(timerthing,"RTC_timer"); Commands->Destroy_Object(timerthing); IsRTC = false; idrtc = 0; } else if (Get_Team(ID) == Get_Team(idrtc)) { Console_Input(StrFormat("ppage %d You're on the same team, you cannot swap with %s.",ID,Get_Player_Name_By_ID(idrtc)).c_str()); } } } } void RTC_timer::Created(GameObject *obj) { Commands->Start_Timer(obj, this,60.0f, 1); } void RTC_timer::Timer_Expired(GameObject *obj, int number) { if (number == 1) { IsRTC = false; GameObject *obj2 = Get_GameObj(idrtc); if (!obj2) { idrtc = 0; Commands->Destroy_Object(obj); Destroy_Script(); } else { Console_Input(StrFormat("msg %s's request to change teams has expired.",Get_Player_Name_By_ID(idrtc)).c_str()); Console_Input(StrFormat("ppage %d Your request to change teams has timed out.",idrtc).c_str()); idrtc = 0; Commands->Destroy_Object(obj); Destroy_Script(); } } } ScriptRegistrant<RTC_timer> RTC_timer_Registrant("RTC_timer",""); class RTCChatCommand : public ChatCommandClass { void Triggered(int ID,const TokenClass &Text,int ChatType) { if (SwapCheck(ID) == false) { RequestTeamChange(Get_Player_Name_By_ID(ID)); } else { Console_Input(StrFormat("ppage %d You have already swapped once this map.",ID).c_str()); } } }; ChatCommandRegistrant<RTCChatCommand> RTCChatCommandReg("!swap;!rtc;!requestteamchange",CHATTYPE_ALL,0,GAMEMODE_ALL);In Zeile 651 steht:
for (int i = 0; i < SwappedPlayers.size(); i++) { if (SwappedPlayers[i].SwappedPlayerName == Get_Player_Name_By_ID(ID)) { return true; } } return false; }
-
Die Fehlermeldung ist doch recht eindeutig: Du vergleichst einen signed int (die Inde-Variable i) mit einem unsigned Wert (vector<>::size() liefert einen size_t zurück). Wenn du den Typ von i änderst, sollte es eigentlich weitergehen.
-
Verstehe leider nur Bahnhof

-
Nochmal langsam: i ist ein int (alias signed int, also Ganzzahl mit Vorzeichen), SwappedPlayers.size() liefert einen size_t (vermutlich unsigned int oder unsigned long, aber auf jeden Fall eine Ganzzahl ohne Vorzeichen. Um diese Werte vergleichen zu können, muß der Compiler einen von beiden umcasten - und warnt dich an der Stelle, daß das nicht ohne Informationsverlust funktionieren kann. Die Lösung besteht darin, gleich den richtigen Datentyp zu verwenden:
for (size_t i = 0; i < SwappedPlayers.size(); i++)
-
Vielen Dank, hat geklappt
-
void MDB_SSGM_Building::Damaged(GameObject *obj, GameObject *damager, float damage) { if ((Commands->Get_ID(damager) != 0 && !Settings->InvinBuild) && (Settings->GameMode == 1 || Settings->GameMode == 5)) { if (damage > 0) { if (Settings->LogBuildingDamage && ReportDamage) { ReportDamage = false; FDSMessage(StrFormat("The %s is under attack!",Translate_Preset(obj).c_str()),"_BUILDING"); Commands->Start_Timer(obj,this,Settings->BuildingDamageInt,1); }nun möchte ich Console_Input hinzufügen:
void MDB_SSGM_Building::Damaged(GameObject *obj, GameObject *damager, float damage) { if ((Commands->Get_ID(damager) != 0 && !Settings->InvinBuild) && (Settings->GameMode == 1 || Settings->GameMode == 5)) { if (damage > 0) { if (Settings->LogBuildingDamage && ReportDamage) { ReportDamage = false; FDSMessage(StrFormat("The %s is under attack!",Translate_Preset(obj).c_str()),"_BUILDING"); Console_Input(StrFormat("msg The %s is under attack!",Translate_Preset(obj).c_str()),"_BUILDING"); Commands->Start_Timer(obj,this,Settings->BuildingDamageInt,1); }Leider klappt das nicht so wie ich will ...
1>gmscripts.cpp
1>.\gmscripts.cpp(1619) : error C2660: 'Console_Input': Funktion akzeptiert keine 2 Argumentestatt FDSMessage nur Console_Input scheitert auch - selber fehler
-
Wo kommt denn diese Funktion eigentlich her? Normalerweise solltest du eine Dokumentation verfügbar haben, die auch erklärt, wie man sie verwenden soll (oder zumindest den Header mit dem Funktions-Prototyp).