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
Скрипт использует мои функции псевдо-массивов, которые по-прежнему можно найти здесь:
https://yoko.uokit.com/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