• logo_cipsoft
    Nowe serwery zostały otwarte 19 Lut 2025:
    Noctalia (Open PvP) Ignitera (Open PvP) us_logo Xybra (Open PvP)

Spells Tower Attack

Status
Zamknięty.

Oskar

Forum friend
Dołączył
Styczeń 24, 2009
Posty
2256
Liczba reakcji
331
Oto skrypt, kt?ry napisa?em dla zabicia czasu.

Tworzymy plik o nazwie tower.lua w data/spells/scripts i wklejamy:
PHP:
local function isWalkable(pos, creature, proj, pz)
if getTileThingByPos({x=pos.x,y=pos.y,z=pos.z,stackpos=0}).itemid == 0 then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false, true end
local n = not proj and 3 or 2
for i = 0, 255 do
	pos.stackpos = i
	local tile = getTileThingByPos(pos)
		if tile.itemid ~= 0 and not isCreature(tile.uid) then
			if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
				return false
			end
		end
end
return true
end

local config = {
				storage = 2000,
				max_towers = 1, --maksymalna ilo?? wie?
				name = 'tower', --nazwa NPCta
				time = 30, --w sekundach
				}
				
function onTargetTile(cid, pos)
if isWalkable(pos, true, true, true) then
	local npc = doCreateNpc(config.name, pos, false)
	doCreatureSetStorage(npc, config.storage, cid)
	doPlayerSetStorageValue(cid, config.storage, (getPlayerStorageValue(cid, config.storage) <= 0 and 1 or getPlayerStorageValue(cid, config.storage) + 1))
	return addEvent(function()
							pos.stackpos = STACKPOS_TOP_CREATURE
							if getThingFromPos(pos).uid == 0 then
								return true
							end
							if getCreatureName(getThingFromPos(pos).uid):lower() == config.name:lower() then
								doPlayerSetStorageValue(cid, config.storage, getPlayerStorageValue(cid, config.storage) - 1)
								return doRemoveCreature(getThingFromPos(pos).uid)
							end end,
							config.time * 1000,
							cid, pos, config)
	
end
return true
end

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, true)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_BIGCLOUDS)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGYBALL)
setCombatCallback(combat, CALLBACK_PARAM_TARGETTILE, "onTargetTile")

function onCastSpell(cid, var)
if getPlayerStorageValue(cid, config.storage) >= config.max_towers then
	return doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'Posiadasz maksymalna ilosc wie?yczek.')
end
return doCombat(cid, combat, var)
end
Do spells.xml doklejamy:
PHP:
<rune name="Test" id="2268" mana="0" allowfaruse="1" exhaustion="0" blocktype="solid" event="script" value="test.lua"/>

Idziemy do data/NPC/scripts, tworzymy plik tower.lua i wklejamy:
PHP:
local damage = {
				['fire'] = {COMBAT_FIREDAMAGE,CONST_ME_FIREAREA,CONST_ANI_FIRE},
				['ice'] = {COMBAT_ICEDAMAGE,CONST_ME_ICEATTACK,CONST_ANI_ICE},
				['earth'] = {COMBAT_EARTHDAMAGE,CONST_ME_CARNIPHILA,CONST_ANI_EARTH},
				['energy'] = {COMBAT_ENERGYDAMAGE,CONST_ME_ENERGYHIT,CONST_ANI_ENERGY},
				['death'] = {COMBAT_DEATHDAMAGE,CONST_ME_MORTAREA,CONST_ANI_SUDDENDEATH},
				['holy'] = {COMBAT_HOLYDAMAGE,CONST_ME_HOLYDAMAGE,CONST_ANI_HOLY},
				['physical'] = {COMBAT_PHYSICALDAMAGE,CONST_ME_GROUNDSHAKER,CONST_ANI_LARGEROCK},
				['drown'] = {COMBAT_DROWNDAMAGE,CONST_ME_WATERSPLASH,CONST_ANI_SMALLICE}
				}
local types = {'fire','ice','earth','energy','death','holy','physical','drown'}

local keywordHandler, t, h = KeywordHandler:new(), 0, 0
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
function onCreatureAppear(cid)        	npcHandler:onCreatureAppear(cid)        	end
function onCreatureDisappear(cid)     	npcHandler:onCreatureDisappear(cid) 	    end

local config = {
				storage = 2000,
				range = 5, --zasieg wiezyczki
				player_range = 8, --odleg?o?? na jak? mo?e odej?? gracz by wieza nie znikla
				----
				damage = {300,500}, --obrazenia {min, max}
				interval = 2, --w sekundach
				type = '', --typ obra?e?, do wyboru 'fire', 'ice', 'earth', 'energy', 'death', 'holy', 'physical', 'drown'
				----
				interval_healing = 3, --po ile atak?w ma ulecza?, na przyk?ad: atak (1), atak (2), atak (3), leczenie, atak (1) ...
				healing = {10,25} --leczenie {od, do}
				}
function onThink()                    	npcHandler:onThink()                 		
local cid = getCreatureStorage(getNpcCid(), config.storage)
if isPlayer(cid) then
	if getDistanceBetween(getThingPos(getNpcCid()), getThingPos(cid)) > config.player_range then
		doRemoveCreature(getNpcCid())
		return doPlayerSetStorageValue(cid, config.storage, 0)
	end
else
	return doRemoveCreature(getNpcCid())
end 
if getCreatureTarget(cid) == 0 then
	t = 0
	return true
end
if getDistanceBetween(getThingPos(getNpcCid()), getThingPos(getCreatureTarget(cid))) > config.range then
	return true
end
if t == 0 and h <= config.interval_healing then
	local v = damage[config.type]
	if not v then
		local s = types[math.random(#types)]
		v = damage[s]
	end
		if h == config.interval_healing then
			doTargetCombatHealth(getNpcCid(), cid, COMBAT_HEALING, config.healing[1], config.healing[2], CONST_ME_MAGIC_BLUE)
			h = 0
			t = 1
			return doSendDistanceShoot(getThingPos(getNpcCid()), getThingPos(cid), CONST_ANI_ENERGYBALL)
		end
		doTargetCombatHealth(getNpcCid(), getCreatureTarget(cid), v[1], -config.damage[1], -config.damage[2], v[2])
		doSendDistanceShoot(getThingPos(getNpcCid()), getThingPos(getCreatureTarget(cid)), v[3])
		h = h + 1
		t = 1
elseif t > 0 and t <= config.interval then
	t = t + 1
else
	t = 0
end
return true
end

npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())
W data/NPC robimy plik tower.xml i wklejamy:
PHP:
<?xml version="1.0"?>
<npc name="Tower" floorchange="0" speed="0" hidehealth="1" walkable="0" script="tower.lua">
    <health now="150" max="150"/>
    <look type="333"/>
</npc>


Jak to dzia?a zapytacie?
Ot?? u?ywaj?c runy (w tym przypadku 2268 czyli SD) gdziekolwiek w zasi?gu wzroku, pojawi si? nam wie?yczka, kt?ra b?dzie nam pomaga? w walce.
Bazowo jest ustawione, i? atakuje co 2 sekundy ze wszystkich ?ywio??w (losowo??), a co 3 tury zaprzestaje ataku by nas uleczy?. Wie?a po 30 sekundach znika.
Og?lnie skrypt jest banalny i prosty, ale wystarczy troch? umiej?tno?ci i mn?stwo wyobra?ni by stworzy? z tego co? naprawd? godnego uwagi.
 
Odp: Tower Attack

Hm zrobi?em tak samo ale mi nie dzia?a.Skrypty z 8.54 raczej powinny dzia?a? na 8.6?
 
Ostatnia edycja:
Odp: Tower Attack

Edytowa?em pierwszy post. Przekopiuj skrypt spells do siebie.
Wszelkie propozycje czy b??dy zg?asza? w temacie.
 
Odp: Tower Attack

Ok dzia?a dzi?ks ;). Tylko ma?y problemik.Po up?ywie tych 30 sekund nie znika.
 
Ostatnia edycja:
Odp: Tower Attack

PHP:
local function isWalkable(pos, creature, proj, pz)
if getTileThingByPos({x=pos.x,y=pos.y,z=pos.z,stackpos=0}).itemid == 0 then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false, true end
local n = not proj and 3 or 2
for i = 0, 255 do
    pos.stackpos = i
    local tile = getTileThingByPos(pos)
        if tile.itemid ~= 0 and not isCreature(tile.uid) then
            if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
                return false
            end
        end
end
return true
end

local config = {
                storage = 2000,
                max_towers = 1, --maksymalna ilo?? wie?
                name = 'tower', --nazwa NPCta
                time = 30, --w sekundach
                }
                
function onTargetTile(cid, pos)
if isWalkable(pos, true, true, true) then
    local npc = doCreateNpc(config.name, pos, false)
    doCreatureSetStorage(npc, config.storage, cid)
    doPlayerSetStorageValue(cid, config.storage, (getPlayerStorageValue(cid, config.storage) <= 0 and 1 or getPlayerStorageValue(cid, config.storage) + 1))
    return addEvent(function()
                            if npc == 0 then
                                return true
                            end
                            if getCreatureName(npc):lower() == config.name:lower() then
                                doPlayerSetStorageValue(cid, config.storage, getPlayerStorageValue(cid, config.storage) - 1)
                                return doRemoveCreature(npc)
                            end end,
                            config.time * 1000,
                            cid, config, npc)
    
end
return true
end

local combat = createCombatObject()
setCombatParam(combat, COMBAT_PARAM_TARGETCASTERORTOPMOST, true)
setCombatParam(combat, COMBAT_PARAM_EFFECT, CONST_ME_BIGCLOUDS)
setCombatParam(combat, COMBAT_PARAM_DISTANCEEFFECT, CONST_ANI_ENERGYBALL)
setCombatCallback(combat, CALLBACK_PARAM_TARGETTILE, "onTargetTile")

function onCastSpell(cid, var)
if getPlayerStorageValue(cid, config.storage) >= config.max_towers then
    return doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, 'Posiadasz maksymalna ilosc wie?yczek.')
end
return doCombat(cid, combat, var)
end
Niech spr?buje.

#2 down
U mnie wszystko dzia?a przy pierwotnym skrypcie, wi?c gdzie widzisz to niedopatrzenie?
 
Ostatnia edycja:
Odp: Tower Attack

Ni, w dalszym ci?gu nic.Nie wiem co jest nie tak, nie wywala ?adnego b??du.
 
Odp: Tower Attack

nie wywala? Bo go po prostu nie ma, jest to zwyk?? niedopatrzenie, kt?re mistrz Oskar na pewno znajdzie.

Co do skryptu to na prawd? dobrze Ci wyszed? i jest on oryginalny.
 
Odp: Tower Attack

Od?wie?am
Notka moderatorska:

Nie uwa?asz ?e zrobienie tego jako summon zamiast jako npc by?o by lepszym rozwi?zaniem? //dubler
 
Ostatnio edytowane przez moderatora:
Odp: Tower Attack

Pozwole sobie odkopac temat poniewaz mam problem/pytanie/sprawe/prosbe? chyba wszystko naraz:D

Otoz chcialbym prosic o przerobienie skryptu aby zamiast wierzy pojawial sie jakis monster ktory by za nami chodzil i dzialal jako healer ale nie atakowal by monsterkow;p

czy jest ktos w stanie zrobic cos takiego? oczywiscie monster znikalby po 30sekundach a jego hp roslo by wraz z naszym lvlem, powiedzmy o 10hp co poziom:D
 
Odp: Tower Attack

Nie jest to trudne do wykonania, ale z mojej strony na darmow? pomoc niestety liczy? ju? nie ma co.
 
Odp: Tower Attack

Zmie?cie z
PHP:
<rune name="Test" id="2268" mana="0" allowfaruse="1" exhaustion="0" blocktype="solid" event="script" value="test.lua"/>
na
PHP:
<rune name="Test" id="2268" mana="0" allowfaruse="1" exhaustion="0" blocktype="solid" event="script" value="tower.lua"/>
 
Odp: Tower Attack

OK poradzilem sobie z tym na swoj sposob, jednak gdy zainstalowalem ten skrypt w swoim ots, stowrzylem pierwsza lepsza postacia tego Towera po czym zrobilem reset serwera i teraz za kazdym razem gdy chce zrobic Tower pokazuje mi ze posiadam juz maksymalna ich liczbe. Tak jakby zapisalo fakt ze juz go stworzylem... da sie to jakos naprawic?
 
Odp: Tower Attack

onLogout zeruj tego storaga
ewentualnie onStartup zeruj tego storaga wszystkim graczom przez odpowiednie zapytanie do bazy
 
Odp: Tower Attack

a czy w spells.xml

zamiast <rune name="Test" id="2268" mana="0" allowfaruse="1" exhaustion="0" blocktype="solid" event="script" value="test.lua"/>

Nie powinno by? tower.lua ? xd
 
Odp: Tower Attack

Bardzo fajny czar . Mo?e mi si? przyda dzieki :)
 
Odp: Tower Attack

@vexler222
Forum jest od pomocy nikt nie b?dzie specjalnie pisa? na GG. Stw?rz temat i opisz sw?j problem, a nie.

@topic
Skrypt dzia??, testowa?em, ale bardziej pasuje na OTSy typu Fun / Evo. Nic skomplikowanego, a ca?kiem przydatne.
 
Odp: Tower Attack

Wielkie dzi?ki, przyda si? :p
Pozdrawiam Kickers.
 
Status
Zamknięty.
Do góry