tt44 01 sie 2014, 11:46
Stalker
Posty: 88
Rejestracja: 12 lut 2013, 19:02
Ostatnio: 24 cze 2017, 19:07
Kozaki:
60
Na górę
Post autor: tt44  Ostatnio zmieniony 09 lut 2015, 18:02 przez tt44, łącznie zmieniany 1 raz.
Zamieszczam tutaj kilka przydatnych funkcji mojego autorstwa z opisem oraz przykładem zastosowania.
Nowe funkcje będą dodawane co jakiś czas.

Funkcja zwraca ilość posiadanych przez aktora przedmiotów o danej nazwie:
[lua]
function GetItemsCount(item)
local count = 0
for index = 0, db.actor:object_count() - 1 do
if db.actor:object(index):section() == item then
count = count + 1
end
end
return count
end
[/lua]
Zastosowanie:
[lua]
local count = GetItemsCount("bandage") -- zmienna count zawiera ilość bandaży posiadanych przez aktora

-- Jeśli aktor posiada pięć lub więcej bandaży
if count >= 5 then
[/lua]

Wywołanie obrażeń na obiekcie
[lua]
--[[
target - tu podajesz obiekt na którym mają zostać wywołane obrażenia np. db.actor
strength - siła obrażenia np. 0.15
hit_type - typ obrażenia (burn, chemical_burn, dummy, explosion, fire_wound, radiation, shock, strike, telepatic lub wound)
]]
function hit_obj(target, strength, hit_type)
local h = hit()
h.draftsman = target
h.direction = vector():set(0,0,0)
h.power = strength
h.impulse = 1
h.type = hit_type
target:hit(h)
end
[/lua]
Zastosowanie:
[lua]
-- Zadaje aktorowi telepatyczne obrażenia o sile 0.50
hit_obj(db.actor, 0.50, hit.telepatic)
[/lua]
Postawili kozaka za ten post (2):
GośćPlaargath
Weteran
Posty: 655
Rejestracja: 23 mar 2010, 15:12
Ostatnio: 21 maja 2025, 23:10
Kozaki:
189
Na górę
Post autor: Plaargath 
Co jakiś czas? :D
Ja chętnie pooglądam, co tam stworzyłeś ciekawego. Bardzo to uczące, a i czasem ratuje w potrzebie, jak już się zdarzyło.
Obrazek Obrazek

Merkantylizm, srerkantylizm.
Stalker
Posty: 88
Rejestracja: 12 lut 2013, 19:02
Ostatnio: 24 cze 2017, 19:07
Kozaki:
60
Na górę
Post autor: tt44 
Funkcja zwracjąca wybraną linijkę z pliku ini na przykład jakiegoś itemu.
[lua]
-- Opiszę to na przykładzie: Chcemy uzyskać w skrypcie np. kosz chleba:
local cost = parse_ini(system_ini(), "bread", "cost", "string", 0) -- zmienna ta zawiera koszt chleba
function parse_ini(ini, section, line, type, default)
if ini:section_exist(section) and ini:line_exist(section, line) then
if type == "string" then
return ini:r_string(section, line)
elseif type == "float" then
return ini:r_float(section, line)
elseif type == "bool" then
return ini:r_bool(section, line)
else
return default
end
end
end
[/lua]
Jako section podać należy nazwę sekcji, line to nazwa linijki z danej sekcji, a jako type "string", "float" lub "bool" w zależności co dana linijka zawiera.

Funkcja usuwająca określoną ilość itemów. Jako section należy podać nazwę itemu, a jako count ilość.
[lua]
function RemoveItems(section, count)
for index = 0, db.actor:object_count() - 1 do
if count > 0 and db.actor:object(index):section() == section then
alife():release(alife():object(db.actor:object(index):id()))
count = count - 1
end
end
end
[/lua]
Weteran
Posty: 655
Rejestracja: 23 mar 2010, 15:12
Ostatnio: 21 maja 2025, 23:10
Kozaki:
189
Na górę
Post autor: Plaargath 
W Lua bez pisania serioznych funkcji nie da się porównywać tablic. Znalazłem fajnego hacka, który przydaje się, jeśli na szybko chcę porównać dwie proste tablice i nie interesuje mnie kolejność w nich:
[lua]
function HackCompare(t1,t2)
table.sort(t1)
table.sort(t2)
return unpack(t1) == unpack(t2)
end
[/lua]

Mi się to przydaje się to do porównywania zawartości configów/pluginów.
Obrazek Obrazek

Merkantylizm, srerkantylizm.
Odpowiedz

Podobne tematy