Idee: Spieler entfernen/hinzufügen

Entwicklung und Vorstellung von LUA Skripten für ASC oder den Mapeditor

Moderator: Moderatoren2

Benutzeravatar
Snake
Oberstabsfeldwebel
Oberstabsfeldwebel
Beiträge: 3754
Registriert: Sa 13. Jun 2009, 21:49
Einheitenset: Cybs
Wohnort: Berlin - Pankow
Kontaktdaten:

Re: Idee: Spieler entfernen/hinzufügen

Beitrag von Snake »

Danke für die Mühe!

Das wird SVs die Arbeit unheimlich erleichtern.

Wer weiß schon, wie viele Kartenbestandteile bei vergangenen Löschaktionen
aus Versehen mit gelöscht wurden? Es haben PBP schon so viele Spieler
verlassen, da musste garantiert die eine oder andere Stadt dran glauben ^^
You are either a player or a victim.
Benutzeravatar
itaker
Oberstabsfeldwebel
Oberstabsfeldwebel
Beiträge: 2505
Registriert: Sa 13. Jun 2009, 23:02
Einheitenset: Rehaner
Wohnort: Karlsruhe

Re: Idee: Spieler entfernen/hinzufügen

Beitrag von itaker »

kann das jemand in die aktuelle Lua-Skripte Sammlung einpflegen? und als lua skript zu nutzen, einfach den obeneingegeben text in einen texteditor einfügen und dann als .lua benenen?
Benutzeravatar
motsch
Stabsfeldwebel
Stabsfeldwebel
Beiträge: 1512
Registriert: Mi 17. Jun 2009, 18:10
Einheitenset: Cromoner
Wohnort: Baiersdorf

Re: Idee: Spieler entfernen/hinzufügen

Beitrag von motsch »

Der eingepflegte Text kann in einen Lua-Editor hineinkopiert werden. Dann das Lua-Skript in das ASC Verzeichnis speichern. Vom Map- oder PBP-Editor kann es dann ausgeführt werden.

Das Skript ändert nur den Eigentümer der Gebäude, deren ID im table kartenbestandteile enthalten sind. Es gibt noch immer ein paar Ausnahmen. Außerdem werden in den Gebäuden enthaltene Einheiten nicht gelöscht, sondern wechseln ebenfalls den Besitzer.
Gruß
motsch
Hanni
Oberstabsfeldwebel
Oberstabsfeldwebel
Beiträge: 2898
Registriert: Sa 31. Jan 2009, 13:04
Einheitenset: Cromoner MK4
Wohnort: Leipzig

Re: Idee: Spieler entfernen/hinzufügen

Beitrag von Hanni »

Wenn Motsch ein paar Worte zur Hanhabung etc. verfasst, dann werde ich das ganze mit in die Skript Sammlung einpflegen.

Grüße
Hanni
Die DIN 16554 regelt, dass eine Kugelschreibermine einen 200 m langen Strich ziehen können muss.
----------
Beiträge in meiner Funktion als Admin haben diese Farbe!
Benutzeravatar
motsch
Stabsfeldwebel
Stabsfeldwebel
Beiträge: 1512
Registriert: Mi 17. Jun 2009, 18:10
Einheitenset: Cromoner
Wohnort: Baiersdorf

Re: Idee: Spieler entfernen/hinzufügen

Beitrag von motsch »

Das Skript kann erst nach dem nächsten ASC update fertiggestellt werden. Es fehlt noch der Filter nach dem "Versteckt"-flag.
Außerdem habe ich noch ein paar Änderungen vorgesehen, bin also noch nicht damit fertig.
Gruß
motsch
Benutzeravatar
motsch
Stabsfeldwebel
Stabsfeldwebel
Beiträge: 1512
Registriert: Mi 17. Jun 2009, 18:10
Einheitenset: Cromoner
Wohnort: Baiersdorf

Re: Idee: Spieler entfernen/hinzufügen

Beitrag von motsch »

Es wird jetzt auch nach versteckten Gebäuden gefiltert.
Es werden nur auf der map vorhandene Spieler zur Auswahl angeboten, ausgenommen Spieler 0 (SV) und Spieler 8 (neutral). KI und OFF gestellte Spieler werden zur Auswahl gestellt.
Vor der Neutralstellung werden keine Einheiten entfernt und keine Bauoptionen (Secret Factory).
Auswahl.png
Gruß
motsch
Benutzeravatar
motsch
Stabsfeldwebel
Stabsfeldwebel
Beiträge: 1512
Registriert: Mi 17. Jun 2009, 18:10
Einheitenset: Cromoner
Wohnort: Baiersdorf

Re: Idee: Spieler entfernen/hinzufügen

Beitrag von motsch »

Was kann dieses Skript:
  • Es bietet nur vorhandene Spieler zur Auswahl an, außer Slot0 (SV) und Slot 8 (neutral)
  • Es stellt alle Gebäude des gewählten Spielers, die Kartenbestandteie sind, auf neutral
  • Es löscht aus den Kartenbestandteilen des Spielers alle Bauoptionen
  • Es löscht aus den Kartenbestandteilen des Spielers alle Einheiten
Das Löschen der Einheiten aus den auf neutral zu stellenden Gebäuden wird so erreicht:
  • suche freies Feld
  • stelle einen EvacPod dort hin
  • verschiebe den Inhalt des Gebäudes dort hinein
  • lösche den EvacPod
Es sind noch einige Ausgaben zur Programmkontrolle integriert und es fehlt noch die geforderte readme, aber die größten Herausforderungen sind gelöst.

Code: Alles auswählen

--
-- Dieses Script setzt alle Gebäude eines wählbaren Spielers die als Kartenbestandteil gelten auf neutral.
--
-- Verwendbar in: mapeditor
--
-- -------------------------------------------------------------------------------------------------------
--
-- globale Variable vorbelegen:
--
neutral = false
counter = 0
counterunit = 0
zeile = 0
xEvac = 0
yEvac = 0
EvacPod = asc.getBuildingType( 12016 )
--
-- -------------------------------------------------------------------------------------------------------
--
-- Table für Kartenbestandteile erzeugen:
--
kartenbestandteile = {}
kartenbestandteile.Headquarter1 = 3
kartenbestandteile.Town1 = 24
kartenbestandteile.Akku = 25
kartenbestandteile.Lab10 = 27
kartenbestandteile.Lab25 = 28
kartenbestandteile.Headquarter2 = 55
kartenbestandteile.Headquarter3 = 56
kartenbestandteile.TrainingCenter = 57
kartenbestandteile.VillaDeng = 58
kartenbestandteile.Town2 = 59
kartenbestandteile.Town3 = 60
kartenbestandteile.Headquarter4 = 1002
kartenbestandteile.Bunker1 = 1003
kartenbestandteile.SecretDepot = 1005
kartenbestandteile.MountainEntrance = 1009
kartenbestandteile.HQTitanNet = 1010
kartenbestandteile.Bunker2 = 1015
kartenbestandteile.Bunker3 = 1016
kartenbestandteile.SecretFactory = 1202
kartenbestandteile.SecretTown = 1203
kartenbestandteile.Wreck = 1299
kartenbestandteile.Aussenposten = 12031
kartenbestandteile.Fabrik = 12032
kartenbestandteile.Treibstoffbunker = 12033
--
-- -------------------------------------------------------------------------------------------------------
--
-- Karte laden
map = asc.getActiveMap()
--
-- -------------------------------------------------------------------------------------------------------
--
-- Ermittle freies Feld und Speichere Koordinaten in xEvac, yEvac
for y = 0,map:height()-1 do
  for x = 0,map:width()-1 do
    fld = map:getField(x,y)

    -- prüfe ob ein Gebäude, eine Einheit oder ein Objekt auf dem Feld ist
    if not fld:getVehicle() and not fld:getBuildingEntrance() and fld:getObjectCount() == 0 then

      xEvac = x
      yEvac = y      

    end
  end
end
--
-- ---------------------------------------------------------------------------------------------------------
--
-- Funktionen:
--
--
-- leere Cargoslots
function removeCargo ( gebaeude )
   local sum = 0
   local c
   local unit
   -- setze EvacPod
   asc.placeBuilding( map, asc.MapCoordinate(xEvac,yEvac) , EvacPod , slotNr )
   local fld = map:getField(xEvac,yEvac)
   local Evac = fld:getBuildingEntrance()

   -- prüfe Inhalt slot für slot
   for c = 0, gebaeude:getCargoCount()-1 do
       
     unit = gebaeude:getCargo(c)
             
     if unit then
           
           -- verschiebe Gebäudeinhalt nach EvacPod
           gebaeude:removeUnitFromCargo(unit)
           Evac:addToCargo(unit)
           sum = sum + 1
       
     end
   end
   
   -- lösche EvacPod
   fld:removeBuilding()
   
   return sum

end
--
--
-- Ermittle Gebäude ID
function GetGebaeudeID ( feldGebaeude )
   
   local gebaeudetyp = feldGebaeude:getType()
   
   local gebaeudeid   = gebaeudetyp:getID()
   
   return gebaeudeid

 end
--
--
-- Prüfe ob aktuelle GebäudeID Kartenbestandteil oder Gebäude versteckt ist
function CheckGebaeudeID ( _index )

   if gebaeudeID == kartenbestandteile [ _index ] or not gebaeude:getVisible() then
      
      neutral = true
      
      return neutral
      
   end
   
end
--
-- -------------------------------------------------------------------------------------------------------
--

--
-- Dialog zur Auswahl der Slotnummer 
--
-- Table zum Speichern der Slotnummern in Abhängigkeit zur Zeile des Ausgabefensters 
slotnrTabl = {}

-- Array zur Ausgabe der Spielernamen
s = asc.StringArray() 

-- wähle nacheinander Spielerslot 1 bis 7
for slot = 1,7,1 do
   
   -- Zeiger auf gewählten Spieler
   player = map:getPlayer (slot)
   
   -- nur bei auf der map existierenden Spielern
   if player:exist() then 
      
      -- Hole Name des gewählten Spielers und speichere zur Ausgabe 
      s:add ( player:getName() )
      
      -- Speichere Slotnummer in Abhängigkeit zur Zeile des Ausgabefensters
      slotnrTabl [zeile] = slot
      
      -- erhöhe Zeilenzähler
      zeile = zeile + 1
   
   end

end
--
-- erzeugt Auswahlfenster und speichert gewählte Zeilennummer in Variable zeileNr 
zeileNr = asc.selectString('Spielerauswahl', s )

-- bei zeileNr = -1 wurde 'CANCEL' gewählt
if zeileNr < 0 then
   
   return

end

-- Zeige Spielerslot an in Abhängigkeit der gewählten Zeilennummer 
slotNr = slotnrTabl [zeileNr]

asc.infoMessage( 'gewaehlter Slot : ' .. slotNr )

-- Dialog Ende -------------------------------------------------------------------------------------------
--

-- Absuchen der Karte Feld für Feld
for y = 0,map:height()-1 do
   for x = 0,map:width()-1 do

      --Zeiger auf Feld setzen
      feld = map:getField(x,y)

      -- Prüfe ob ein Gebäudeeingang auf dem Feld ist
      if feld:getBuildingEntrance() then

         -- Prüfe ob das Gebäude dem ausgewählten Spieler gehört
         if feld:getBuildingEntrance():getOwner() == slotNr then
             
            -- Zeiger auf Gebäude setzen
            gebaeude = feld:getBuildingEntrance()
             
            -- Ermittle ID des Gebäudes per Funktion
            gebaeudeID   = GetGebaeudeID( gebaeude )
                           
            -- Prüfe ob Gebäude Kartenbestandteil ist per Funktion
            table.foreach ( kartenbestandteile , CheckGebaeudeID )
            
            -- Gebäude ist Kartenbestandteil
            if neutral then
            
               -- alle Bauoptionen löschen
               gebaeude:deleteAllProductionLines()
               
               -- Einheiten löschen per Funktion
               counterunit = counterunit + removeCargo( gebaeude ) 
              
               -- Gebäude neutral stellen
               gebaeude:convert ( 8 )

               -- Erhöhe Zähler 
               counter = counter + 1
                
               -- Stelle Zeiger "Gebäude ist Kartenbestandteil" zurück
               neutral = false
                
            end
         end
      end
   end
end

asc.infoMessage( counter .. ' Gebaeude neutral gestellt' )

asc.infoMessage( counterunit .. ' Einheiten in Gebaeuden geloescht' )
Gruß
motsch
Benutzeravatar
Snake
Oberstabsfeldwebel
Oberstabsfeldwebel
Beiträge: 3754
Registriert: Sa 13. Jun 2009, 21:49
Einheitenset: Cybs
Wohnort: Berlin - Pankow
Kontaktdaten:

Re: Idee: Spieler entfernen/hinzufügen

Beitrag von Snake »

Vielen Dank.
Wenn man dies hochrechnet auf die noch durchzuführenden Löschaktionen
in der Zukunft, kommt eine erhebliche Zeiteinsparung für alle SVs heraus!
You are either a player or a victim.
Benutzeravatar
motsch
Stabsfeldwebel
Stabsfeldwebel
Beiträge: 1512
Registriert: Mi 17. Jun 2009, 18:10
Einheitenset: Cromoner
Wohnort: Baiersdorf

Re: Idee: Spieler entfernen/hinzufügen

Beitrag von motsch »

Was kann dieses Skript:
  • Es bietet nur vorhandene Spieler zur Auswahl an, außer Slot0 (SV) und Slot 8 (neutral)
  • Es stellt alle Gebäude des gewählten Spielers, die Kartenbestandteie sind, auf neutral
  • Es löscht aus den Kartenbestandteilen des Spielers alle Bauoptionen
  • Es löscht aus den Kartenbestandteilen des Spielers alle Einheiten
  • Vor jedem Ausführen zeigt es eine kurze Beschreibung
  • Es zeigt am Ende eine Zusammenfassung
Dieses Skript bricht ab, wenn kein EvakPod auf die Karte gesetzt werden kann. Da dies im normalen Spielbetrieb nahezu nicht vorkommen wird, betrachte ich dieses Skript als fertig und bitte, es in den Skriptpack aufzunehmen.

Code: Alles auswählen

--
-- Dieses Script setzt alle Gebäude eines wählbaren Spielers die als Kartenbestandteil gelten auf neutral.
--
-- Stand: 20.09.2013
--
-- Verwendbar in: mapeditor
--
text1 = 'Mit diesem Skript kann ein Spieler ausgewaehlt werden.'
text2 = ' Anschliessend werden alle Staedte und alle anderen Gebaeude dieses Spielers,'
text3 = ' die Kartenbestandteile sind, auf neutral gestellt. Zusaetzlich werden aus den'
text4 = ' betroffenen Gebaeuden alle Produktionsstrassen und Einheiten geloescht.'
text5 = ' Dazu muss ein Hexfeld auf der Karte vorhanden sein, auf dem ein EvakPod'
text6 = ' aufgestellt werden kann, da das Skript andernfalls abbricht.' 
-- -------------------------------------------------------------------------------------------------------
--
-- globale Variable vorbelegen:
--
neutral = false
counter = 0
counterunit = 0
zeile = 0
EvacPod = asc.getBuildingType( 12016 )
--
-- -------------------------------------------------------------------------------------------------------
--
-- Table für Kartenbestandteile erzeugen:
--
kartenbestandteile = {}
kartenbestandteile.Headquarter1 = 3
kartenbestandteile.Town1 = 24
kartenbestandteile.Akku = 25
kartenbestandteile.Lab10 = 27
kartenbestandteile.Lab25 = 28
kartenbestandteile.Headquarter2 = 55
kartenbestandteile.Headquarter3 = 56
kartenbestandteile.TrainingCenter = 57
kartenbestandteile.VillaDeng = 58
kartenbestandteile.Town2 = 59
kartenbestandteile.Town3 = 60
kartenbestandteile.Headquarter4 = 1002
kartenbestandteile.Bunker1 = 1003
kartenbestandteile.SecretDepot = 1005
kartenbestandteile.MountainEntrance = 1009
kartenbestandteile.HQTitanNet = 1010
kartenbestandteile.Bunker2 = 1015
kartenbestandteile.Bunker3 = 1016
kartenbestandteile.SecretFactory = 1202
kartenbestandteile.SecretTown = 1203
kartenbestandteile.Wreck = 1299
kartenbestandteile.Aussenposten = 12031
kartenbestandteile.Fabrik = 12032
kartenbestandteile.Treibstoffbunker = 12033
--
-- -------------------------------------------------------------------------------------------------------
--
-- Karte laden
map = asc.getActiveMap()
--
-- -------------------------------------------------------------------------------------------------------
--

asc.infoMessage (text1 .. text2 .. text3 .. text4 .. text5 .. text6)
--
-- Ermittle freies Feld und Speichere Koordinaten in xEvac, yEvac
x = 0
y = 0
repeat
  repeat
  fld = map:getField(x,y)
  
  -- prüfe ob ein Gebäude, eine Einheit oder ein Objekt auf dem Feld ist
  if not fld:getVehicle() and not fld:getBuildingEntrance() and fld:getObjectCount() == 0 then
    xEvac = x
    yEvac = y
  end
 
  x = x + 1
  until x == map:width() or xEvac ~= nil
x = 0
y = y + 1
until y == map:height() or yEvac ~= nil 

if xEvac == nil or yEvac == nil then
  asc.warningMessage("Es konnte kein freies Feld ermittelt werden. Sktript abgebrochen.")
  return
end
--
-- ---------------------------------------------------------------------------------------------------------
--
-- Funktionen:
--
--
-- leere Cargoslots
function removeCargo ( gebaeude )
   local sum = 0
   local c
   local unit
   -- setze EvacPod
   asc.placeBuilding( map, asc.MapCoordinate(xEvac,yEvac) , EvacPod , slotNr )
   local fld = map:getField(xEvac,yEvac)
   local Evac = fld:getBuildingEntrance()

   -- prüfe Inhalt slot für slot
   for c = 0, gebaeude:getCargoCount()-1 do
       
     unit = gebaeude:getCargo(c)
             
     if unit then
           
           -- verschiebe Gebäudeinhalt nach EvacPod
           gebaeude:removeUnitFromCargo(unit)
           Evac:addToCargo(unit)
           sum = sum + 1
       
     end
   end
   
   -- lösche EvacPod
   fld:removeBuilding()
   
   return sum

end
--
--
-- Ermittle Gebäude ID
function GetGebaeudeID ( feldGebaeude )
   
   local gebaeudetyp = feldGebaeude:getType()
   
   local gebaeudeid   = gebaeudetyp:getID()
   
   return gebaeudeid

 end
--
--
-- Prüfe ob aktuelle GebäudeID Kartenbestandteil oder Gebäude versteckt ist
function CheckGebaeudeID ( _index )

   if gebaeudeID == kartenbestandteile [ _index ] or not gebaeude:getVisible() then
      
      neutral = true
      
      return neutral
      
   end
   
end
--
-- -------------------------------------------------------------------------------------------------------
--

--
-- Dialog zur Auswahl der Slotnummer 
--
-- Table zum Speichern der Slotnummern in Abhängigkeit zur Zeile des Ausgabefensters 
slotnrTabl = {}

-- Array zur Ausgabe der Spielernamen
s = asc.StringArray() 

-- wähle nacheinander Spielerslot 1 bis 7
for slot = 1,7,1 do
   
   -- Zeiger auf gewählten Spieler
   player = map:getPlayer (slot)
   
   -- nur bei auf der map existierenden Spielern
   if player:exist() then 
      
      -- Hole Name des gewählten Spielers und speichere zur Ausgabe 
      s:add ( player:getName() )
      
      -- Speichere Slotnummer in Abhängigkeit zur Zeile des Ausgabefensters
      slotnrTabl [zeile] = slot
      
      -- erhöhe Zeilenzähler
      zeile = zeile + 1
   
   end

end
--
-- erzeugt Auswahlfenster und speichert gewählte Zeilennummer in Variable zeileNr 
zeileNr = asc.selectString('Spielerauswahl', s )

-- bei zeileNr = -1 wurde 'CANCEL' gewählt
if zeileNr < 0 then
   
   return

end

-- Zeige Spielerslot an in Abhängigkeit der gewählten Zeilennummer 
slotNr = slotnrTabl [zeileNr]


-- Dialog Ende -------------------------------------------------------------------------------------------
--

-- Absuchen der Karte Feld für Feld
for y = 0,map:height()-1 do
   for x = 0,map:width()-1 do

      --Zeiger auf Feld setzen
      feld = map:getField(x,y)

      -- Prüfe ob ein Gebäudeeingang auf dem Feld ist
      if feld:getBuildingEntrance() then

         -- Prüfe ob das Gebäude dem ausgewählten Spieler gehört
         if feld:getBuildingEntrance():getOwner() == slotNr then
             
            -- Zeiger auf Gebäude setzen
            gebaeude = feld:getBuildingEntrance()
             
            -- Ermittle ID des Gebäudes per Funktion
            gebaeudeID   = GetGebaeudeID( gebaeude )
                           
            -- Prüfe ob Gebäude Kartenbestandteil ist per Funktion
            table.foreach ( kartenbestandteile , CheckGebaeudeID )
            
            -- Gebäude ist Kartenbestandteil
            if neutral then
            
               -- alle Bauoptionen löschen
               gebaeude:deleteAllProductionLines()
               
               -- Einheiten löschen per Funktion
               counterunit = counterunit + removeCargo( gebaeude ) 
              
               -- Gebäude neutral stellen
               gebaeude:convert ( 8 )

               -- Erhöhe Zähler 
               counter = counter + 1
                
               -- Stelle Zeiger "Gebäude ist Kartenbestandteil" zurück
               neutral = false
                
            end
         end
      end
   end
end

asc.infoMessage( counterunit .. ' Einheiten aus Gebaeuden geloescht und ' .. counter .. ' Gebaeude neutral gestellt.' )
Gruß
motsch
Benutzeravatar
itaker
Oberstabsfeldwebel
Oberstabsfeldwebel
Beiträge: 2505
Registriert: Sa 13. Jun 2009, 23:02
Einheitenset: Rehaner
Wohnort: Karlsruhe

Re: Idee: Spieler entfernen/hinzufügen

Beitrag von itaker »

Hallo Motsch
ich wollte den Skript nutzen, die Einheiten wurde jedoch nicht gelöscht, was hat es mit dem Evakpod an sich?
muss der Evakpod bevor man den skript ausruft aufgestellt werden?
soll der Evakpod auf der name des Spieler laufen?
das Programm soll man mit über den PBP Editor starten oder?

was mir in diesem zusammenhang einfällt, es wäre Klasse wenn die Einheiten der zu sichernde Spieler in den Evakpod verschoben werden könnten...
Antworten