Keron
12.03.2010 19:41
1039 mal angesehen

Code für Gräber

Beim Tod eines Soldaten wird einfach ein Grab (3 Auswahlmöglichkeiten, siehe Screenshot) plaziert. Sieht viel schöner aus als diese Schwerter und Bögen immer:). Leider blockiert es bei einer größeren Schlacht dann das Gebiet :). Es ist jedoch nur für größere Maps mit wenig Kampf geeignet.

zusammen mit Mordred entwickelt :)


Auf das Bild klicken, um es in Originalgröße zu sehen (297,05 KB)


Kommentare

» Kommentar schreiben

fighty
13.11.2015 17:32

Es sieht aber gut aus. Wenn man den Friedhof etwas abseits plaziert stört er nicht.

Siedler_Team
14.03.2010 11:05

Zitat von fritz 98:

Kann "mein" SucheAufDerWelt schon lange.


Aha! Man lernt eben nie aus.

andre111
14.03.2010 09:57

@fritz 98:

Ich hab die Funktion überarbeitet, weis aber nicht ob ich sie hier rein stellen soll.

FG
andre111

fritz_98
14.03.2010 09:40

@Keron: Nimm doch einfach einen Trigger: Events.LOGIC_EVENT_ENTITY_DESTROYED
Beispiele sind das hier und mein Waffenaufhebecode.

@Siedler_Team: Kann "mein" SucheAufDerWelt schon lange.
s. der Rote Baron 1 und alles, was danach kommt.

MfG
Fritz

Siedler_Team
13.03.2010 21:58

Naja fritz,
Keron meint sicherlich die abgeänderte Version SucheAufDerWelt von Kingsia, die auch andere Entities als ID null oder ID eins suchen kann.

Ich befürchte aber, dass die vielen HiResJobs ihm einen Strich durch die Rechnung machen, wenn sie auf einer "realen" Map verwendet werden.

Was auf einer recht kleinen Testmap Map laufen mag, wird da vermutlich einen Absturz verursachen.

Grund:
Wenn mit der Funktion abgefragt werden soll:
"Setze ein Grab, wenn irgendwo auf der Map eine stirbt." Dann müssen die vielen HiResJobs die ganze Karte absuchen!

Viel Vergnügen!
aCids Bedenken sind berechtigt und die teile ich hiermit.

fritz_98
13.03.2010 20:32

Von Kingsia?!

Keron
13.03.2010 12:08

Benötigt wird noch die SucheAufDerWelt - am besten die von Kingsia

function SucheAufDerWelt(_player, _entity, _groesse, _punkt)
  local punktX1, punktX2, punktY1, punktY2, data
  local gefunden = {}
  local rueck
  -- Version Kingsia
  if not _groesse then
    _groesse = Logic.WorldGetSize()
	_groesse = math.floor(_groesse * 0.71)
  end
  if not _punkt then
    _punkt = {X = _groesse/2, Y = _groesse/2}
  end
  if _player == 0 then
    data ={Logic.GetEntitiesInArea(_entity, _punkt.X, _punkt.Y, _groesse, 16)}
  else
    data ={Logic.GetPlayerEntitiesInArea(_player,_entity, _punkt.X, _punkt.Y, _groesse, 16)}
  end
  if data[1] >= 16 then 
    local _klgroesse = _groesse / 2 
    local punktX1 = _punkt.X - _groesse / 4
    local punktX2 = _punkt.X + _groesse / 4
    local punktY1 = _punkt.Y - _groesse / 4
    local punktY2 = _punkt.Y + _groesse / 4
    rueck = SucheAufDerWelt(_player, _entity, _klgroesse, {X=punktX1,Y=punktY1})
    for i = 1, table.getn(rueck) do
      if not IstDrin(rueck[i], gefunden) then
		table.insert(gefunden, rueck[i])
		end
	end
	rueck = SucheAufDerWelt(_player, _entity, _klgroesse, {X=punktX1,Y=punktY2})
    for i = 1, table.getn(rueck) do
      if not IstDrin(rueck[i], gefunden) then
        table.insert(gefunden, rueck[i])
      end
    end
    rueck = SucheAufDerWelt(_player, _entity, _klgroesse, {X=punktX2,Y=punktY1})
    for i = 1, table.getn(rueck) do
      if not IstDrin(rueck[i], gefunden) then
        table.insert(gefunden, rueck[i])
      end
    end
    rueck = SucheAufDerWelt(_player, _entity, _klgroesse, {X=punktX2,Y=punktY2})
    for i = 1, table.getn(rueck) do
      if not IstDrin(rueck[i], gefunden) then
         table.insert(gefunden, rueck[i])
      end
    end
  else
    table.remove(data,1)
    for i = 1, table.getn(data) do
      if not IstDrin(data[i], gefunden) then
        table.insert(gefunden, data[i])
      end
    end
  end
  return gefunden
end
function IstDrin(_wert, _table)
  for i = 1, table.getn(_table) do
    if _table[i] == _wert then 
        return true 
    end 
  end
  return false
end

Mordred
13.03.2010 11:06

Die ist die ungekürzte Version aus dem Kopf.
geht auch einfacher - nur ein HiResJob

aCid
13.03.2010 09:09

StartSimpleHiResJob("CSOM"
StartSimpleHiResJob("CBOM"
StartSimpleHiResJob("CAOM"
StartSimpleHiResJob("CShOM"
StartSimpleHiResJob("CSShOM"
StartSimpleHiResJob("CROMEins"
StartSimpleHiResJob("CROMZwei"
StartSimpleHiResJob("CPAOM"

also schön vorsichtig sein mit der funktion. kann unter umständen sehr viel ressourcen fressen.

Der_Falke
12.03.2010 21:23

Hut ab!

Keron
12.03.2010 21:17

Bedienung:
1. Die drei Teile sind unabhängig, solange alle im skript stehen
2. Kopiert jeden Teil, und fügt ihn irgendwo unten in euren Skript ein
3. Dann setzt in der ungefähren mitte eurer Map eine entity, die irgendeinen Namen hat, z.b. "Middle"
4. Dann schreibt das in die FirstMapAction():

KontrolliereDieMapAufDrops("Middle","Blumenbeet")


"Blumenbeet" ist eine von drei auswahlmöglichkeiten:

"Grab" oder "Blumenbeet" oder "Huenengrab" 


fertig!

für die mapper, die es genauer wollen:
ihr könnt irgendwo in eurem skript die art der Gräber per

ChangeGraveTypeKDMAD("Huenengrab")


ändern. ebenso mit

AllowKDMAD(false)


die automatische Grabveränderung ausschalten und mit

AllowKDMAD(true)


wieder einschalten...
Viel Spaß!

Keron
12.03.2010 21:14

... und der Anfang.

function KontrolliereDieMapAufDrops(_pos,_art)
-- this function is powered by Keron and Mordred...
-- Choose Options only: "Grab","Blumenbeet","Huenengrab"!
-- For this comfort you need "SucheAufDerWelt"!
 ControlDropsOnMapok = ControlDropsOnMapok or true
 ControlDropsOnMapPosition = GetPosition(_pos)
  if _art == "Grab" then
   ControlDropsOnMapArt = "Graab"
  elseif _art == "Blumenbeet" then
   ControlDropsOnMapArt = "Bluumenbeet"
  elseif _art == "Huenengrab" then
   ControlDropsOnMapArt = "Huueenengrab"
  elseif _art ~= "Graab" and _art ~= "Bluumenbeet" and _art ~= "Huueenengrab" then
   Message("KontrolliereDieMapAufDrops Error! Your choosen color:200,200,0 _art @color:255,255,255 is not existing!")
  end
 StartSimpleHiResJob("CSOM")
 StartSimpleHiResJob("CBOM")
 StartSimpleHiResJob("CAOM")
 StartSimpleHiResJob("CShOM")
 StartSimpleHiResJob("CSShOM")
 StartSimpleHiResJob("CROMEins")
 StartSimpleHiResJob("CROMZwei")
 StartSimpleHiResJob("CPAOM")
end
function CSOM()
 if ControlDropsOnMapok == true then
  _CSOM()
 end
  end
   function CBOM()
    if ControlDropsOnMapok == true then
     _CBOM()
    end
     end
      function CAOM()
       if ControlDropsOnMapok == true then
         _CAOM()
        end
       end
      function CShOM()
       if ControlDropsOnMapok == true then
        _CShOM()
       end
      end
     function CROMEins()
      if ControlDropsOnMapok == true then
       _CROMEins()
      end
    end
     function CROMZwei()
      if ControlDropsOnMapok == true then
       _CROMZwei()
      end
     end
    function CPAOM()
     if ControlDropsOnMapok == true then
     _CPAOM()
     end
   end
  function CSShOM()
   if ControlDropsOnMapok == true then
    _COSOM()
   end
  end
 function CSShOM()
   if ControlDropsOnMapok == true then
  _CSShOM()
 end
end

Keron
12.03.2010 21:07

Da der 2te Teil...

function _CSOM()
CSOM_ = SucheAufDerWelt(0,Entities.XD_DroppedSword,(Logic.WorldGetSize()*100),ControlDropsOnMapPosition)
 if table.getn(CSOM_) > 0 then
   CSOM_ = CSOM_[1]
   Gravecontrol(ControlDropsOnMapArt,CSOM_)
   DestroyEntity(CSOM_)
 end
end
function _CBOM()
CBOM_ = SucheAufDerWelt(0,Entities.XD_DroppedBow,(Logic.WorldGetSize()*100),ControlDropsOnMapPosition)
 if table.getn(CBOM_) > 0 then
   CBOM_ = CBOM_[1]
   Gravecontrol(ControlDropsOnMapArt,CBOM_)
   DestroyEntity(CBOM_)
 end
end
function _CAOM()
CAOM_ = SucheAufDerWelt(0,Entities.XD_DroppedAxeShield,(Logic.WorldGetSize()*100),ControlDropsOnMapPosition)
 if table.getn(CAOM_) > 0 then
   CAOM_ = CAOM_[1]
   Gravecontrol(ControlDropsOnMapArt,CAOM_)
   DestroyEntity(CAOM_)
 end
end
function _CROMEins()
CROMEins_ = SucheAufDerWelt(0,Entities.XD_SoldierRifle1_Rifle,(Logic.WorldGetSize()*100),ControlDropsOnMapPosition)
 if table.getn(CROMEins_) > 0 then
   CROMEins_ = CROMEins_[1]
   Gravecontrol(ControlDropsOnMapArt,CROMEins_)
   DestroyEntity(CROMEins_)
 end
end
function _CROMZwei()
CROMZwei_ = SucheAufDerWelt(0,Entities.XD_SoldierRifle2_Rifle,(Logic.WorldGetSize()*100),ControlDropsOnMapPosition)
 if table.getn(CROMZwei_) > 0 then
   CROMZwei_ = CROMZwei_[1]
   Gravecontrol(ControlDropsOnMapArt,CROMZwei_)
   DestroyEntity(CROMZwei_)
 end
end
function _CPAOM()
CShOM_ = SucheAufDerWelt(0,Entities.XD_DroppedShield,(Logic.WorldGetSize()*100),ControlDropsOnMapPosition)
 if table.getn(CShOM_) > 0 then
   CShOM_ = CShOM_[1]
   Gravecontrol(ControlDropsOnMapArt,CShOM_)
   DestroyEntity(CShOM_)
 end
end
function _CShOM()
CShOM_ = SucheAufDerWelt(0,Entities.XD_DroppedShield,(Logic.WorldGetSize()*100),ControlDropsOnMapPosition)
 if table.getn(CShOM_) > 0 then
   CShOM_ = CShOM_[1]
   Gravecontrol(ControlDropsOnMapArt,CShOM_)
   DestroyEntity(CShOM_)
 end
end
function _CSShOM()
CSShOM_ = SucheAufDerWelt(0,Entities.XD_DroppedSwordShield,(Logic.WorldGetSize()*100),ControlDropsOnMapPosition)
 if table.getn(CSShOM_) > 0 then
   CSShOM_ = CSShOM_[1]
   Gravecontrol(ControlDropsOnMapArt,CSShOM_)
   DestroyEntity(CSShOM_)
 end
end
function _CPAOM()
CPAOM_ = SucheAufDerWelt(0,Entities.XD_DroppedPoleArm,(Logic.WorldGetSize()*100),ControlDropsOnMapPosition)
 if table.getn(CPAOM_) > 0 then
   CPAOM_ = CPAOM_[1]
   Gravecontrol(ControlDropsOnMapArt,CPAOM_)
   DestroyEntity(CPAOM_)
 end
end

Keron
12.03.2010 21:03

ok, zu lang... hier nochmal: letzer Teil


function Gravecontrol(_type,_pos)
  _pos = GetPosition(_pos)
local X = math.floor(_pos.X/100)*1
local Y = math.floor(_pos.Y/100)*1
local offsetX = -5 + X *100
local offsetY = -5 + Y *100
if ControlDropsOnMapArt == "Graab" then
 local Gravecontrolli={
     {"XD_Tomb2",offsetX+0,offsetY+0,0,0,""},
     {"XD_PlantDecal4",offsetX-10,offsetY+50,0,0,""},
     {"XD_Flower1",offsetX+40,offsetY+150,0,0,""},
     {"XD_PlantDecal1",offsetX-10,offsetY+100,0,0,""},
     }
   for i = 1, table.getn(Gravecontrolli) do
  Logic.CreateEntity(Entities[Gravecontrolli[i][1]],Gravecontrolli[i][2],Gravecontrolli[i][3],Gravecontrolli[i][4],Gravecontrolli[i][5],Gravecontrolli[i][6])
 end
elseif ControlDropsOnMapArt == "Bluumenbeet" then
 local Gravecontrolli={
     {"XD_Tomb4",offsetX+0,offsetY+0,0,0,""},
     {"XD_PlantDecalLarge4",offsetX+0,offsetY+0,0,0,""},
     {"XD_PlantDecal3",offsetX+0,offsetY-220,0,0,""},
     {"XD_PlantDecal3",offsetX+0,offsetY-100,0,0,""},
     {"XD_Plant3",offsetX+0,offsetY-50,0,0,""},
     {"XD_NephilimFlower",offsetX+150,offsetY-100,0,0,""},
     {"XD_NephilimFlower",offsetX+100,offsetY+0,100,0,""},
     }
   for i = 1, table.getn(Gravecontrolli) do
  Logic.CreateEntity(Entities[Gravecontrolli[i][1]],Gravecontrolli[i][2],Gravecontrolli[i][3],Gravecontrolli[i][4],Gravecontrolli[i][5],Gravecontrolli[i][6])
 end
elseif ControlDropsOnMapArt == "Huueenengrab" then
 local Gravecontrolli={
     {"XD_GraveComplete7",offsetX+0,offsetY+0,0,0,""},
     {"XD_RockGrass5",offsetX+20,offsetY+150,70,0,""},
     {"XD_GreeneryBush5",offsetX+150,offsetY-250,0,0,""},
     {"XD_MiscSwordShield",offsetX+50,offsetY-50,300,0,""},
     {"XD_BoneAnimal7",offsetX-100,offsetY+0,300,0,""},
     {"XD_Bush2",offsetX-250,offsetY-20,300,0,""},
     {"XD_AppleTree1",offsetX+190,offsetY+100,0,0,""},
     }
   for i = 1, table.getn(Gravecontrolli) do
    Logic.CreateEntity(Entities[Gravecontrolli[i][1]],Gravecontrolli[i][2],Gravecontrolli[i][3],Gravecontrolli[i][4],Gravecontrolli[i][5],Gravecontrolli[i][6])
  end
 end
end
function ChangeGraveTypeKDMAD(_what)
  if _what == "Grab" then
   ControlDropsOnMapArt = "Graab"
  elseif _what == "Blumenbeet" then
   ControlDropsOnMapArt = "Bluumenbeet"
  elseif _what == "Huenengrab" then
   ControlDropsOnMapArt = "Huueenengrab"
  elseif _what ~= "Graab" and _what ~= "Bluumenbeet" and _what ~= "Huueenengrab" then
   Message("ChangeGraveTypeKDMAD Error! Your choosen color:200,200,0 _what @color:255,255,255 is not existing!")
  end
end
function AllowKDMAD(_ok)
 if _ok == true then
  ControlDropsOnMapok = true
 elseif _ok == false then
  ControlDropsOnMapok = false
 elseif _ok ~= true and _ok ~= false then
   Message("AllowKDMAD Error! Your choosen color:200,200,0 _ok @color:255,255,255 is not existing!")
 end
end

Keron
12.03.2010 21:00

In dem Screen ist die funktion zu sehen. Falls sie jemanden interresiert, ist sie hier:
[code]
function KontrolliereDieMapAufDrops(_pos,_art)
-- this function is powered by Keron and Mordred...
-- Choose Options only: "Grab","Blumenbeet","Huenengrab"!
-- For this comfort you need "SucheAufDerWelt"!
ControlDropsOnMapok = ControlDropsOnMapok or true
ControlDropsOnMapPosition = GetPosition(_pos)
if _art == "Grab" then
ControlDropsOnMapArt = "Graab"
elseif _art == "Blumenbeet" then
ControlDropsOnMapArt = "Bluumenbeet"
elseif _art == "Huenengrab" then
ControlDropsOnMapArt = "Huueenengrab"
elseif _art ~= "Graab" and _art ~= "Bluumenbeet" and _art ~= "Huueenengrab" then
Message("KontrolliereDieMapAufDrops Error! Your choosen color:200,200,0 _art @color:255,255,255 is not existing!"
end
StartSimpleHiResJob("CSOM"
StartSimpleHiResJob("CBOM"
StartSimpleHiResJob("CAOM"
StartSimpleHiResJob("CShOM"
StartSimpleHiResJob("CSShOM"
StartSimpleHiResJob("CROMEins"
StartSimpleHiResJob("CROMZwei"
StartSimpleHiResJob("CPAOM"
end
function CSOM()
if ControlDropsOnMapok == true then
_CSOM()
end
end
function CBOM()
if ControlDropsOnMapok == true then
_CBOM()
end
end
function CAOM()
if ControlDropsOnMapok == true then
_CAOM()
end
end
function CShOM()
if ControlDropsOnMapok == true then
_CShOM()
end
end
function CROMEins()
if ControlDropsOnMapok == true then
_CROMEins()
end
end
function CROMZwei()
if ControlDropsOnMapok == true then
_CROMZwei()
end
end
function CPAOM()
if ControlDropsOnMapok == true then
_CPAOM()
end
end
function CSShOM()
if ControlDropsOnMapok == true then
_COSOM()
end
end
function CSShOM()
if ControlDropsOnMapok == true then
_CSShOM()
end
end
function _CSOM()
CSOM_ = SucheAufDerWelt(0,Entities.XD_DroppedSword,(Logic.WorldGetSize()*100),ControlDropsOnMapPosition)
if table.getn(CSOM_) > 0 then
CSOM_ = CSOM_[1]
Gravecontrol(ControlDropsOnMapArt,CSOM_)
DestroyEntity(CSOM_)
end
end
function _CBOM()
CBOM_ = SucheAufDerWelt(0,Entities.XD_DroppedBow,(Logic.WorldGetSize()*100),ControlDropsOnMapPosition)
if table.getn(CBOM_) > 0 then
CBOM_ = CBOM_[1]
Gravecontrol(ControlDropsOnMapArt,CBOM_)
DestroyEntity(CBOM_)
end
end
function _CAOM()
CAOM_ = SucheAufDerWelt(0,Entities.XD_DroppedAxeShield,(Logic.WorldGetSize()*100),ControlDropsOnMapPosition)
if table.getn(CAOM_) > 0 then
CAOM_ = CAOM_[1]
Gravecontrol(ControlDropsOnMapArt,CAOM_)
DestroyEntity(CAOM_)
end
end
function _CROMEins()
CROMEins_ = SucheAufDerWelt(0,Entities.XD_SoldierRifle1_Rifle,(Logic.WorldGetSize()*100),ControlDropsOnMapPosition)
if table.getn(CROMEins_) > 0 then
CROMEins_ = CROMEins_[1]
Gr

Mordred
12.03.2010 19:44

Hi Keron, kennen wir uns nicht?
Aber noch erwähnen: Benötigt wird noch Suche auf der Welt.
Der Code ist ein ganz schöner Brocken, also wird man es ich zweimal überlegen müssen. Aber der PC schafft ja ne menge, da ist der Skript das kleinste
Keine nervenden Schwerter mehr, nur noch schöne Blumenverzierte Gräber.

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

Impressum