# Anticheat

Mithilfe der Chat Eingabe **!incubation2** kann man im Single Player Modus die Cheats aktivieren. Gibt man dann **!win** ein gilt die Karte als gewonnen und wird aufgedeckt. Falls man nicht möchte dass der Spieler die Karte aufdeckt kann man das per Script verhindern.\
\
Ein solches Script könnte wie folgt aussehen&#x20;

```lua
function anticheat()           
	if Game.IsAlmostAllLandExplored() == 1 then
	Game.SetAlliesDontRevealFog(1)
	Game.ResetFogging()
        Tutorial.Exit()
	end
end
 
function TurnOnLandExploreCheck()
	Game.EnableLandExploredCheck(1)
end
 
function new_game()
	dbg.stm("Script Loaded")
       request_event(VictoryConditionCheck, Events.VICTORY_CONDITION_CHECK)
       request_event(TurnOnLandExploreCheck,Events.FIRST_TICK_OF_NEW_OR_LOADED_GAME)
	request_event(anticheat,Events.FIVE_TICKS)
	request_event(cheathelp,Events.TICK)
end
 
function register_functions()
	reg_func(VictoryConditionCheck)
	reg_func(TurnOnLandExploreCheck)
	reg_func(anticheat)
	reg_func(cheathelp)
end
 
--//Beispiel Siegesbedingung, in diesem Fall besiege Spieler 2//--
function VictoryConditionCheck()
	Game.DefaultPlayersLostCheck()
	if Game.HasPlayerLost(1) == 0
	and Game.HasPlayerLost(2) == 1		
	and Game.HasPlayerLost(3) == 1
	and Game.HasPlayerLost(4) == 1
	and Game.HasPlayerLost(5) == 1
	then
		unrequest_event(anticheat,Events.FIVE_TICKS)
		Game.EnemyPlayersLost(1)
	end
	Game.DefaultGameEndCheck()
end
```

Dieses Besipiel ist natürlich nicht perfekt, die Verwendung der Funktion **Game.IsAlmostAllLandExplored()** bringt einige Nachteile mit sich. Sie kontrolliert wie viel Prozent der Karte mit Land vom Spieler bereits entdeckt wurde, also nicht schwarz ist. Erreicht diese Zahl die 95% wertet **Game.IsAlmostAllLandExplored() == 1** zu TRUE aus. Es ist hier also möglich die Anticheat-Funktion zu triggern ohne zu cheaten.\
\
Als nächstes betrachten wir die Möglichkeiten damit die Anticheat-Funktion nicht triggert ohne zu cheaten.\
\
Am einfachsten wäre es als Mapper eine unerreichbare Insel zu erstellen die mindestens 5% der Landmasse einnimmt. Man sollte hierbei beachten dass der Spieler nicht die Trojaner spielt und keine Maya als Gegner eingestellt sind da mit dem Zauber ***Orakel von Delphi*** der Trojaner und ***Verbannung*** der Maya diese Bedingung durchbrochen werden kann.\
\
Die am meisten Verwendete Option ist das Ausschalten der Anti-Cheat Funktion nach einem gewissen Zeitraum zum Beispiel 100 Minuten.\
Eine weitere Alternative wäre, dass man Funktion ausschaltet nachdem eine bestimmte Anzahl an Gegnern besiegt wurde. Bei 5 Gegner könnte man nach 2 besiegten Gegnern die Funktion abschalten. So könnte das ganze insgesamt aussehen&#x20;

```lua
function anticheat()           
	if Game.IsAlmostAllLandExplored() == 1 then
	Game.SetAlliesDontRevealFog(1)
	Game.ResetFogging()
       Tutorial.Exit()
	end
end
 
function cheathelp()
	if Game.Time() == 100 then
	unrequest_event(anticheat,Events.FIVE_TICKS)
	end
 
	if Game.HasPlayerLost(2) + Game.HasPlayerLost(3) + Game.HasPlayerLost(4) + Game.HasPlayerLost(5) > 1 then
	unrequest_event(anticheat,Events.FIVE_TICKS)
	end
end
 
function TurnOnLandExploreCheck()
	Game.EnableLandExploredCheck(1)
end
 
function new_game()
	dbg.stm("Script Loaded")
       request_event(VictoryConditionCheck, Events.VICTORY_CONDITION_CHECK)
       request_event(TurnOnLandExploreCheck,Events.FIRST_TICK_OF_NEW_OR_LOADED_GAME)
	request_event(anticheat,Events.FIVE_TICKS)
	request_event(cheathelp,Events.TICK)
end
 
function register_functions()
	reg_func(VictoryConditionCheck)
	reg_func(TurnOnLandExploreCheck)
	reg_func(anticheat)
	reg_func(cheathelp)
end
 
--//Beispiel Siegesbedingung, in diesem Fall besiege Spieler 2//--
function VictoryConditionCheck()
	Game.DefaultPlayersLostCheck()
	if Game.HasPlayerLost(1) == 0
	and Game.HasPlayerLost(2) == 1		
	and Game.HasPlayerLost(3) == 1
	and Game.HasPlayerLost(4) == 1
	and Game.HasPlayerLost(5) == 1
	then
		unrequest_event(anticheat,Events.FIVE_TICKS)
		Game.EnemyPlayersLost(1)
	end
	Game.DefaultGameEndCheck()
end
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.settlers-united.com/s4-lua-api-de/tutorials/advanced-tipps/anticheat.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
