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 Argumente

    statt 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).


Anmelden zum Antworten