MFGI

Anything and all.

Moderators: Murderator+, Murderator

Post Reply
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

MFGI

Post by Destruction »

Для тех кто незнает - напомню, это функция которая позволяет создать псевдо-объект по указанным координатам, что бывает очень удобно.

Code: Select all

Usage: mfgi [resend/info/clear/add graphic [x y z] [color] [name]]


У этой функции есть большой недостаток - нельзя удалить конкретный созданный объект, что я и попытался исправить. Теперь можно задать некоторые характеристики псевдо-объекта (расположение на карте, название, тип) и все псевдо-объекты подходящие им будут удалены.
Так же можно удалить объект по его ID который возвращает функция.

Code: Select all

Sub Des.Mfgi.Init(len)
   ; Инициализация Des.Mfgi.* функций.
   ; len(INT) - максимальная длинна названия псевдо-тайла
   uo.SetGlobal("Des.Mfgi.Name-L",str(len))
   uo.SetGlobal("Des.Mfgi.Tile-T",RegArray(0,5))
   uo.SetGlobal("Des.Mfgi.Tile-X",RegArray(0,5))
   uo.SetGlobal("Des.Mfgi.Tile-Y",RegArray(0,5))
   uo.SetGlobal("Des.Mfgi.Tile-Z",RegArray(0,5))
   uo.SetGlobal("Des.Mfgi.Tile-C",RegArray(0,5))
   uo.SetGlobal("Des.Mfgi.Tile-N",RegArray(0,5))
   uo.SetGlobal("Des.Mfgi.Obj-ID",RegArray(0,6))
endsub

Sub Des.Mfgi.DropById(id)
   ; Удаление элемента по ID
   ; id - INT, возвращается из функции Des.Mfgi.Add
   id = str(id)
   var ids = uo.GetGlobal("Des.Mfgi.Obj-ID")
   var nL = uo.GetGlobal("Des.Mfgi.Name-L")
   var gT = uo.GetGlobal("Des.Mfgi.Tile-T")
   var gX = uo.GetGlobal("Des.Mfgi.Tile-X")
   var gY = uo.GetGlobal("Des.Mfgi.Tile-Y")
   var gZ = uo.GetGlobal("Des.Mfgi.Tile-Z")
   var gC = uo.GetGlobal("Des.Mfgi.Tile-C")
   var gN = uo.GetGlobal("Des.Mfgi.Tile-N")
   Des.Mfgi.Clear()
   var i,t,x,y,z,c,n,o
   for i=0 to ArrLen(ids,6)-1
      t = GetArray(gT, i, 5)
      x = GetArray(gX, i, 5)
      y = GetArray(gY, i, 5)
      z = GetArray(gZ, i, 5)
      c = GetArray(gC, i, 5)
      n = GetArray(gN, i, val(nL))
      o = GetArray(ids, i, 6)
      if NOT o == id Then
         Des.Mfgi.Add(val(t),val(x),val(y),val(z),val(c),n,o)
      endif
   next
endsub

Sub Des.Mfgi.Add(t,x,y,z,c,n,id)
   ; Создание нового псевдо-объекта
   ; t - тип псевдо-тайла Int[Dec]
   ; x,y,z - координаты Int[Dec]
   ; c - цвет Int[Dec]
   ; n - название Text
   ; id - номер объекта, или нуль если не надо. Лучше не играться.
   ; false - не указано, согласно документации по uo.mfgi("add")
   if x == false || y == false Then
      x = ""
      y = ""
      z = ""
   else
      x = str(x)
      y = str(y)
      z = str(z)
   endif
   if c == false Then
      c = ""
   else
      c = str(c)
   endif
   if n == false Then
      n = ""
   endif
   if NOT id Then
      id = str(ArrLen(oI,6))
   else
      id = str(id)
   endif
   t = str(t)
   uo.Exec("mfgi add "+t+" "+x+" "+y+" "+z+" "+c+" "+n)
   var nL = uo.GetGlobal("Des.Mfgi.Name-L")
   var gT = uo.GetGlobal("Des.Mfgi.Tile-T")
   var gX = uo.GetGlobal("Des.Mfgi.Tile-X")
   var gY = uo.GetGlobal("Des.Mfgi.Tile-Y")
   var gZ = uo.GetGlobal("Des.Mfgi.Tile-Z")
   var gC = uo.GetGlobal("Des.Mfgi.Tile-C")
   var gN = uo.GetGlobal("Des.Mfgi.Tile-N")
   var oI = uo.GetGlobal("Des.Mfgi.Obj-ID")
   gT = IncArray(gT, 1, 5)
   gT = SetArray(t, gT, ArrLen(gT,5)-1, 5)
   gX = IncArray(gX, 1, 5)
   gX = SetArray(x, gX, ArrLen(gX,5)-1, 5)
   gY = IncArray(gY, 1, 5)
   gY = SetArray(y, gY, ArrLen(gY,5)-1, 5)
   gZ = IncArray(gZ, 1, 5)
   gZ = SetArray(z, gZ, ArrLen(gZ,5)-1, 5)
   gC = IncArray(gC, 1, 5)
   gC = SetArray(c, gC, ArrLen(gC,5)-1, 5)
   gN = IncArray(gN, 1, val(nL))
   gN = SetArray(n, gN, ArrLen(gN,val(nL))-1, val(nL))
   oI = IncArray(oI, 1, 6)
   oI = SetArray(id, oI, ArrLen(oI,6)-1, 6)
   uo.SetGlobal("Des.Mfgi.Tile-T",gT)
   uo.SetGlobal("Des.Mfgi.Tile-X",gX)
   uo.SetGlobal("Des.Mfgi.Tile-Y",gY)
   uo.SetGlobal("Des.Mfgi.Tile-Z",gZ)
   uo.SetGlobal("Des.Mfgi.Tile-C",gC)
   uo.SetGlobal("Des.Mfgi.Tile-N",gN)
   return val(id)
endsub

Sub Des.Mfgi.Drop(Rt,Rx,Ry,Rz,Rc,Rn)
   ; Удаление псевдо-объектов подходящих условиям
   ; Rt,Rx,Ry,Rz,Rc,Rn - параметры тайла для дропа, false - не указано.
   var nL = uo.GetGlobal("Des.Mfgi.Name-L")
   var gT = uo.GetGlobal("Des.Mfgi.Tile-T")
   var gX = uo.GetGlobal("Des.Mfgi.Tile-X")
   var gY = uo.GetGlobal("Des.Mfgi.Tile-Y")
   var gZ = uo.GetGlobal("Des.Mfgi.Tile-Z")
   var gC = uo.GetGlobal("Des.Mfgi.Tile-C")
   var gN = uo.GetGlobal("Des.Mfgi.Tile-N")
   var oI = uo.GetGlobal("Des.Mfgi.Obj-ID")
   if Rx == false || Ry == false Then
      Rx = ""
      Ry = ""
      Rz = ""
   else
      Rx = str(Rx)
      Ry = str(Ry)
      Rz = str(Rz)
   endif
   if Rc == false Then
      Rc = ""
   else
      Rc = str(Rc)
   endif
   if Rn == false Then
      Rn = ""
   endif
   Rt = str(Rt)
   Des.Mfgi.Clear()
   var i,t,x,y,z,c,n,o
   for i=0 to ArrLen(gT,5)-1
      t = GetArray(gT, i, 5)
      x = GetArray(gX, i, 5)
      y = GetArray(gY, i, 5)
      z = GetArray(gZ, i, 5)
      c = GetArray(gC, i, 5)
      n = GetArray(gN, i, val(nL))
      o = GetArray(oI, i, 6)
      if NOT ((Rt == "" || Rt==t) && (Rx == "" || Rx == x) && (Ry == "" || Ry == y) && (Rz == "" || Rz == z) && (Rc == "" || Rc == c) && (Rn == "" || Rn == n)) Then
         Des.Mfgi.Add(val(t),val(x),val(y),val(z),val(c),n,o)
      endif
   next
endsub

Sub Des.Mfgi.Clear()
   ; Удаление всех псевдо-объектов
   var nL = uo.GetGlobal("Des.Mfgi.Name-L")
   uo.Exec("mfgi clear")
   Des.Mfgi.Init(val(nL))
endsub


Демонстрирующий пример:

Code: Select all

sub main()
   Des.Mfgi.Init(25) ; инициализируем функции, длинна названия псевдо-объекта = 25
   Des.Mfgi.Clear() ; удаляем все псевдо-объекты
   DIM mf1[6] ; создаём массив с данными первого псведо-объекта
   mf1[0] = 1295 ; тип псевдо-объекта
   mf1[1] = uo.getX() ; X-координата псевдо-объекта
   mf1[2] = uo.getY() ; Y-координата псевдо-объекта
   mf1[3] = uo.getZ() ; Z-координата псевдо-объекта
   mf1[4] = 76 ; Цвет псевдо-объекта
   mf1[5] = "Fake Added Tile[1]" ; название псевдо-объекта
   DIM mf2[6]
   mf2[0] = 1295
   mf2[1] = uo.getX()+2
   mf2[2] = uo.getY()+2
   mf2[3] = uo.getZ()
   mf2[4] = 76
   mf2[5] = "Fake Added Tile[2]"
   uo.print("Первый тайл добавлен")
   Des.Mfgi.Add(mf1[0],mf1[1],mf1[2],mf1[3],mf1[4],mf1[5],0) ; создаём первый псевдо-объект
   wait(5000)
   uo.print("Второй тайл добавлен")
   var id = Des.Mfgi.Add(mf2[0],mf2[1],mf2[2],mf2[3],mf2[4],mf2[5],0) ; создаём второй псевдо-объект
   wait(5000)
   uo.print("Второй тайл удалён")
   Des.Mfgi.DropById(id) ; удалём второй псевдо-объект
   wait(5000)
   uo.print("Первый тайл удалён")
   Des.Mfgi.Drop(mf1[0],mf1[1],mf1[2],mf1[3],mf1[4],mf1[5]); удаляем первый псевдо-объект
endsub


Скрипт использует мои функции псевдо-массивов, которые по-прежнему можно найти здесь:
viewtopic.php?p=40623
Rijo
Posts: 95
Joined: 2006-04-06 17:16:54
Location: Khab

Post by Rijo »

Блин, прошу прощения, но что то у меня фантазия плохо играет ;). Например для чего нужна эта функция, где её можно применить?
dmitrykit
Posts: 247
Joined: 2005-06-12 22:12:15

Re: MFGI

Post by dmitrykit »

Interesnyj kod... :) do etogo ja kakto nebral v golovu, a udaljal vse :)

P.S destruct, perehodi na pinject :)
Destruction
Junior Expert
Posts: 3221
Joined: 2004-06-24 22:08:56

Re: MFGI

Post by Destruction »

dmitrykit wrote:Interesnyj kod... :) do etogo ja kakto nebral v golovu, a udaljal vse :)

P.S destruct, perehodi na pinject :)

Непривычен мне перл, воткни модуль на пхп? )
dmitrykit
Posts: 247
Joined: 2005-06-12 22:12:15

Post by dmitrykit »

a smisl?:) togda uzh standartnym polzujsja, adnu fignju nezachem nadruguju menjat';)
Post Reply