benötige 2 Funktionen

» Siedler Map Source Forum » Siedler DEdK Script Forum » benötige 2 Funktionen

Seiten: 1

Anarki
#1
31.01.2010 15:31
Beiträge: 518

benötige 2 Funktionen

Hallo liebe erfahrene Skripter

In meinem Multiplayerregeln-Skript habe ich noch folgendes Problem:
(1) Während der Auswahl der Regeln läuft bei Maps in denen es schon Siedler gibt die Steuerzeut
- Lösungsfrage: Gibt es eine Möglichkeit die Steuerzeit zu Resetten? (per Simple Job z.B.) bzw den Timer zu Stoppen und zu Starten?

(2) Weiteres Problem: Während der Auswahl könnten die Spieler schon das ein und andere machen, z.B. vorhandene Leibeigene Holz fällen lassen usw
- Lösungsfrage: Gibt es eine Möglichkeit einem Spieler sämtliche Aktionen zu verbieten? Und natürlich wieder zu erlauben...
- Problem: Allerdings muss Spieler 1 das Tributmenü ansteuern können...

Vielleicht hat jemand eine Idee? Ich bin da ziemlich ratlos.

Die Notlösung wäre, alle Starteinheiten und Gebäude dann erst nach der Auswahl per Skript zu setzen... aber das wäre schon sehr umständlich

____________________
Siedler V Tool: Selbstextrahierende Maps erstellen
Bitte testen und kommentieren

Noigi
#2
31.01.2010 16:47
Beiträge: 772

Zu 1:
Du könntest die Steuern und den Sold für die Zeit einfach ausschalten (die Funktionen sind im Multiplayer noch nicht getestet!):

function DeactivateTaxes()
	GUIAction_SetTaxes(0);
	Logic.SetPlayerPaysLeaderFlag(GUI.GetPlayerID(),0)
end

function ReactivateTaxes()
	GUIAction_SetTaxes(2);
	Logic.SetPlayerPaysLeaderFlag(GUI.GetPlayerID(),1)
end



Zu 2:
Ein Zitat von Chromix aus 2006 :

[...]
Falls wirklich niemand etwas machen soll bis eine Auswahl getroffen wurde, kannst du alle Einheiten beim Spielstart über Logic.SuspendAllEntities() anhalten.
Nachdem über einen Tribut (im MP auf keinen Fall mit einem Auswahlbriefing) etwas ausgewählt wurde, kann alles mit Logic.ResumeAllEntities() fortgesetzt werden.


Das Resume kannst du dann ja in den Tribut-Callback packen.

Anarki
#3
31.01.2010 18:29
Beiträge: 518

Zitat von Noigi:
Zu 1:
Du könntest die Steuern und den Sold für die Zeit einfach ausschalten (die Funktionen sind im Multiplayer noch nicht getestet!):

function DeactivateTaxes()
	GUIAction_SetTaxes(0);
	Logic.SetPlayerPaysLeaderFlag(GUI.GetPlayerID(),0)
end

function ReactivateTaxes()
	GUIAction_SetTaxes(2);
	Logic.SetPlayerPaysLeaderFlag(GUI.GetPlayerID(),1)
end



Zu 2:
Ein Zitat von Chromix aus 2006 :

[...]
Falls wirklich niemand etwas machen soll bis eine Auswahl getroffen wurde, kannst du alle Einheiten beim Spielstart über Logic.SuspendAllEntities() anhalten.
Nachdem über einen Tribut (im MP auf keinen Fall mit einem Auswahlbriefing) etwas ausgewählt wurde, kann alles mit Logic.ResumeAllEntities() fortgesetzt werden.


Das Resume kannst du dann ja in den Tribut-Callback packen.


Zu 2)
Ui danke für die Antworten.
Hätte ich Im Wiki nur mal genauer gelesen! Seltsam nur dass in diesem Skript in der Callback am Ende dann komischerweise kein Logic.ResumeAllEntities drin ist *g* Also so wie im Wiki scheint mir das nicht zu funktionieren
Werd ich probieren müssen!

Zu 1)

function DeactivateTaxes()
	GUIAction_SetTaxes(0);
	Logic.SetPlayerPaysLeaderFlag(GUI.GetPlayerID(),0)
end

function ReactivateTaxes()
	GUIAction_SetTaxes(2);
	Logic.SetPlayerPaysLeaderFlag(GUI.GetPlayerID(),1)
end


Mh, GUIAction ist im Multiplayer meines Wissens immer etwas problematisch. Die Logic.SetPlayerPaysLeaderFlag wird aber funktionieren wenn ich diese für ALLE 8 Spieler durchlaufen lasse, also:
for i = 1,8 do
Logic.SetPlayerPaysLeaderFlag(i,0)
end

PS:
Oh, so wird mir das aber wohl nichts bringen...
Also mit SetTaxes setzt man diese ja auf 0%. Ok, aber schlecht, weil der Timer ja trotzdem weiter läuft.... Aber eventuell bin ich mit (2) sowieso schon bedient.
DENN Einheiten werden ja erst aus dem DZ kommen müssen, damit die Steuern aktiviert werden. Sollte dies durch das Logic.SuspendAllEntities() unterbunden werden dann wird das klappen... muss ich testen

PPS:
Nein, klappt nicht ....
noch schlimmer sogar als klappt nicht, worauf ich wegen Missbrauchsgefahr eben nicht eingehen will

Ok, aber etwas einfacher scheine ich mir es evtl doch machen zu können!
Ich werde es über den Umweg versuchen, die Startdorfzentren "zu deaktiveren", sodass keine Bürger heraus können bis das Spiel gestartet ist. Wenn jemandem was besseres einfällt?

____________________
Siedler V Tool: Selbstextrahierende Maps erstellen
Bitte testen und kommentieren

Dieser Beitrag wurde von Anarki am 31.01.2010 um 18:43 editiert.

Anarki
#4
31.01.2010 20:52
Beiträge: 518

Ohmann... es klingt so einfach, was?

Also ich hab nun die Funktionalität eingebaut. Gut 2 Stunden 'Arbeit' investiert aber es klappt nun (nach ca 10 Spielabstürzen *ggg*)

Lösung:
(1) Einheiten nicht auswählbar machen:
Logic.SuspendAllEntities() - nicht auswählbar
Logic.ResumeAllEntities() - wieder auswählbar
(2) Gebäude nicht zerstörbar machen:

function SetupRulesetNoDestroy()
    GameCallback_GUI_SelectionChanged_OrigProtected = GameCallback_GUI_SelectionChanged;
    GameCallback_GUI_SelectionChanged = function()
        GameCallback_GUI_SelectionChanged_OrigProtected()

            if gvTimeToStart > 0 then
                XGUIEng.ShowWidget( gvGUI_WidgetID.DestroyBuilding, 0 );
                return;
            else
                XGUIEng.ShowWidget( gvGUI_WidgetID.DestroyBuilding, 1 );
            end
    end
end


gvTimeToStart wird anfangs auf 10 gesetzt. Dies wird dann runtergezählt sobald die Auswahl getroffen wurde. Bei 0 gehts los, sodass die 'Gebäude zerstören'-Buttons wieder auswählbar sind

(3) Alle Dorfzentren vorrübergehend zerstören bis Spielstart:

function ReBuildAllPlayerVillageCenters()
   for player = 1, 8 do
      for u = 2,100 do

         if gvVillageCenters[player][u] == nil then
            break
         else
            --ReplaceEntity (Logic.GetEntityAtPosition( gvVillageCenters[player][u].pos.X, gvVillageCenters[player][u].pos.Y ), Entities.PB_VillageCenter1 )
            --DestroyEntity (Logic.GetEntityAtPosition( gvVillageCenters[player][u].pos.X, gvVillageCenters[player][u].pos.Y ))
            CreateEntity( player, Entities.PB_VillageCenter1, gvVillageCenters[player][u].pos )
            --Logic.ChangeEntityPlayerID(temp,player)
         end
      end
   end

end

function ClearAllPlayerVillageCenters()
    gvVillageCenters = {}
    temp = {}
    for player = 1, 8 do
       gvVillageCenters[player] = {}
       temp[player] = {Logic.GetPlayerEntities(player, Entities.PB_VillageCenter1,1,0)} -- Hier gibts du die Player ID und den Entity Typ an
       for u = 2,100 do
          if temp[player][u] == nil then
             break
          else
             gvVillageCenters[player][u] = {}
             gvVillageCenters[player][u].id = temp[player][u]
             gvVillageCenters[player][u].pos = GetPosition( gvVillageCenters[player][u].id );
             DestroyEntity (Logic.GetEntityAtPosition( gvVillageCenters[player][u].pos.X, gvVillageCenters[player][u].pos.Y ) )
          end
       end
    end

end



ClearAllPlayerVillageCenters() - Zerstört alle Dorfzentren Stufe 1 und legt die Positionen und die Spieler IDs in einen Array
ReBuildAllPlayerVillageCenters() - setzt die zerstörten Dorfzentren wieder an Ort und Stelle

(4) Fazit:
Durch (1) wird verhindert, dass Leibis schonmal hacken etc
Durch (2) wird verhindert, dass jemand sich schon Rohstoffe beschafft durch Gebäude zerstören
Durch (3) wird schließlich verhindert, dass Siedler aus den Dorfzentren kommen und somit die 'Steuerzeit' beginnt

____________________
Siedler V Tool: Selbstextrahierende Maps erstellen
Bitte testen und kommentieren

Seiten: 1

SiteEngine v1.5.0 by nevermind, ©2005-2007
Design by SpiderFive (www.siedler-games.de) - English translation by juja

Impressum