• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Lua War system Problem

patriciou

Member
Joined
Dec 26, 2009
Messages
180
Reaction score
6
Hello Otlanders.

Well, I've got a War system With Shields like in Real Tibia but...
I have got a problem with the Command.

When player says - /war Name of Guild

Nothing happens, I dont get any errors in console
or anything like it.

Talkaction/scripts/war/war.lua

PHP:
function onSay(cid, words, param, channel)
	local guild = getPlayerGuildId(cid)
	if(not guild or getPlayerGuildLevel(cid) < GUILDLEVEL_LEADER) then
		doPlayerSendChannelMessage(cid, "", "You cannot execute this talkaction.", TALKTYPE_CHANNEL_W, 0)
		return true
	end
 
	local t = string.explode(param, ",")
	if(not t[2]) then
		doPlayerSendChannelMessage(cid, "", "Not enough param(s).", TALKTYPE_CHANNEL_W, 0)
		return true
	end
 
	local enemy = getGuildId(t[2])
	if(not enemy) then
		doPlayerSendChannelMessage(cid, "", "Guild \"" .. t[2] .. "\" does not exists.", TALKTYPE_CHANNEL_W, 0)
		return true
	end
 
	if(enemy == guild) then
		doPlayerSendChannelMessage(cid, "", "You cannot perform war action on your own guild.", TALKTYPE_CHANNEL_W, 0)
		return true
	end
 
	local enemyName, tmp = "", db.getResult("SELECT `name` FROM `guilds` WHERE `id` = " .. enemy)
	if(tmp:getID() ~= -1) then
		enemyName = tmp:getDataString("name")
		tmp:free()
	end
 
	if(isInArray({"accept", "reject", "cancel"}, t[1])) then
		local query = "`guild_id` = " .. enemy .. " AND `enemy_id` = " .. guild
		if(t[1] == "cancel") then
			query = "`guild_id` = " .. guild .. " AND `enemy_id` = " .. enemy
		end
 
		tmp = db.getResult("SELECT `id`, `begin`, `end`, `payment` FROM `guild_wars` WHERE " .. query .. " AND `status` = 0")
		if(tmp:getID() == -1) then
			doPlayerSendChannelMessage(cid, "", "Currently there's no pending invitation for a war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
			return true
		end
 
		if(t[1] == "accept") then
			local _tmp = db.getResult("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild)
			local state = _tmp:getID() < 0 or _tmp:getDataInt("balance") < tmp:getDataInt("payment")
 
			_tmp:free()
			if(state) then
				doPlayerSendChannelMessage(cid, "", "Your guild balance is too low to accept this invitation.", TALKTYPE_CHANNEL_W, 0)
				return true
			end
 
			db.executeQuery("UPDATE `guilds` SET `balance` = `balance` - " .. tmp:getDataInt("payment") .. " WHERE `id` = " .. guild)
		end
 
		query = "UPDATE `guild_wars` SET "
		local msg = "accepted " .. enemyName .. " invitation to war."
		if(t[1] == "reject") then
			query = query .. "`end` = " .. os.time() .. ", `status` = 2"
			msg = "rejected " .. enemyName .. " invitation to war."
		elseif(t[1] == "cancel") then
			query = query .. "`end` = " .. os.time() .. ", `status` = 3"
			msg = "canceled invitation to a war with " .. enemyName .. "."
		else
			query = query .. "`begin` = " .. os.time() .. ", `end` = " .. (tmp:getDataInt("end") > 0 and (os.time() + ((tmp:getDataInt("begin") - tmp:getDataInt("end")) / 86400)) or 0) .. ", `status` = 1"
		end
 
		query = query .. " WHERE `id` = " .. tmp:getDataInt("id")
		if(t[1] == "accept") then
			doGuildAddEnemy(guild, enemy, tmp:getDataInt("id"), WAR_GUILD)
			doGuildAddEnemy(enemy, guild, tmp:getDataInt("id"), WAR_ENEMY)
		end
 
		tmp:free()
		db.executeQuery(query)
		doBroadcastMessage(getPlayerGuildName(cid) .. " has " .. msg, MESSAGE_EVENT_ADVANCE)
		return true
	end
 
	if(t[1] == "invite") then
		local str = ""
                tmp = db.getResult("SELECT `guild_id`, `status` FROM `guild_wars` WHERE `guild_id` IN (" .. guild .. "," .. enemy .. ") AND `enemy_id` IN (" .. enemy .. "," .. guild .. ") AND `status` IN (0, 1)")
                if(tmp:getID() ~= -1) then
                        if(tmp:getDataInt("status") == 0) then
                                if(tmp:getDataInt("guild_id") == guild) then
                                        str = "You have already invited " .. enemyName .. " to war."
                                else
                                        str = enemyName .. " have already invited you to war."
                                end
			else
				str = "You are already on a war with " .. enemyName .. "."
			end
 
			tmp:free()
		end
 
		if(str ~= "") then
			doPlayerSendChannelMessage(cid, "", str, TALKTYPE_CHANNEL_W, 0)
			return true
		end
 
		local frags = tonumber(t[3])
		if(frags ~= nil) then
			frags = math.max(10, math.min(1000, frags))
		else
			frags = 100
		end
 
		local payment = tonumber(t[4])
		if(payment ~= nil) then
			payment = math.max(100000, math.min(1000000000, payment))
			tmp = db.getResult("SELECT `balance` FROM `guilds` WHERE `id` = " .. guild)
 
			local state = tmp:getID() < 0 or tmp:getDataInt("balance") < payment
			tmp:free()
			if(state) then
				doPlayerSendChannelMessage(cid, "", "Your guild balance is too low for such payment.", TALKTYPE_CHANNEL_W, 0)
				return true
			end
 
			db.executeQuery("UPDATE `guilds` SET `balance` = `balance` - " .. payment .. " WHERE `id` = " .. guild)
		else
			payment = 0
		end
 
		local begining, ending = os.time(), tonumber(t[5])
		if(ending ~= nil and ending ~= 0) then
			ending = begining + (ending * 86400)
		else
			ending = 0
		end
 
		db.executeQuery("INSERT INTO `guild_wars` (`guild_id`, `enemy_id`, `begin`, `end`, `frags`, `payment`) VALUES (" .. guild .. ", " .. enemy .. ", " .. begining .. ", " .. ending .. ", " .. frags .. ", " .. payment .. ");")
		doBroadcastMessage(getPlayerGuildName(cid) .. " has invited " .. enemyName .. " to war till " .. frags .. " frags.", MESSAGE_EVENT_ADVANCE)
		return true
	end
 
	if(not isInArray({"end", "finish"}, t[1])) then
		return false
	end
 
	local status = (t[1] == "end" and 1 or 4)
	tmp = db.getResult("SELECT `id` FROM `guild_wars` WHERE `guild_id` = " .. guild .. " AND `enemy_id` = " .. enemy .. " AND `status` = " .. status)
	if(tmp:getID() ~= -1) then
		local query = "UPDATE `guild_wars` SET `end` = " .. os.time() .. ", `status` = 5 WHERE `id` = " .. tmp:getDataInt("id")
		tmp:free()
		doGuildRemoveEnemy(guild, enemy)
		doGuildRemoveEnemy(enemy, guild)
 
		db.executeQuery(query)
		doBroadcastMessage(getPlayerGuildName(cid) .. " has " .. (status == 4 and "mend fences" or "ended up a war") .. " with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE)
		return true
	end
 
	if(status == 4) then
		doPlayerSendChannelMessage(cid, "", "Currently there's no pending war truce from " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
		return true
	end
 
	tmp = db.getResult("SELECT `id`, `end` FROM `guild_wars` WHERE `guild_id` = " .. enemy .. " AND `enemy_id` = " .. guild .. " AND `status` = 1")
	if(tmp:getID() ~= -1) then
		if(tmp:getDataInt("end") > 0) then
			tmp:free()
			doPlayerSendChannelMessage(cid, "", "You cannot request ending for war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
			return true
		end
 
		local query = "UPDATE `guild_wars` SET `status` = 4, `end` = " .. os.time() .. " WHERE `id` = " .. tmp:getDataInt("id")
		tmp:free()
 
		db.executeQuery(query)
		doBroadcastMessage(getPlayerGuildName(cid) .. " has signed an armstice declaration on a war with " .. enemyName .. ".", MESSAGE_EVENT_ADVANCE)
		return true
	end
 
	doPlayerSendChannelMessage(cid, "", "Currently there's no active war with " .. enemyName .. ".", TALKTYPE_CHANNEL_W, 0)
	return true
end


Talkactions.xml

PHP:
	<talkaction words="/war" channel="0" access="1" event="script" value="war/war.lua" desc="(Guild channel command) War management."/>


Rep++ For Help
 
Thanks CorneX ;)

Ive got it working - It was /war invite, Testers, 100
but you're getting a rep for bigggg Help :)

- - - Updated - - -

Just 1 more Question - I know how to invite :)
but how to Accept ? :D
 
Just 1 more Question - I know how to invite :)
but how to Accept ? :D

/war accept,guild name Accept the invitation to start a war.
/war reject,guild name Reject the invitation to start a war.
/war end,guild name Ends an active war with another guild.
/war cancel,guild name This will cancel the invitation to the guild Black Ninjas
/balance donate 1234 Command for founder of guilds for pay money
/balance pick 1234 Command for founder of guilds for payout money
 
Well, all works except this:
When guild has sent a War to other guild and
other guild wants to accept, they say: /war accept, guildname
and i get an error in console:

PHP:
[Error - TalkAction Interface]
data/talkactions/scripts/war/war.lua:onSay
Description:
data/talkactions/scripts/war/war.lua:70: attempt to call global 'doGuildAddEnemy
' (a nil value)
stack traceback:
        data/talkactions/scripts/war/war.lua:70: in function <data/talkactions/s
cripts/war/war.lua:1>

and Nothing happens, The acceptation is still there and its not accepted

- - - Updated - - -

Rep++ for Help
 
You also have to compile TFS 0.3.7 (best pick would be latest revision) with -
D__WAR_SYSTEM__.
On a Windows machine to compile open project in Dev-Cpp, press ALT+P find there 'C++ Compiler' in one of the tabs and add there -D__WAR_SYSTEM__. Rebuild.
On a Linux open configure.ac find OPTIONAL_FLAGS="" and there add -D__WAR_SYSTEM__ so it looks like this: OPTIONAL_FLAGS="-D__WAR_SYSTEM__". Now type make clean && make -j 5.

...

Also make sure you got in DB, this:

SQL:
CREATE TABLE IF NOT EXISTS `guild_wars` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `guild_id` INT NOT NULL,
  `enemy_id` INT NOT NULL,
  `begin` BIGINT NOT NULL DEFAULT '0',
  `end` BIGINT NOT NULL DEFAULT '0',
  `frags` INT UNSIGNED NOT NULL DEFAULT '0',
  `payment` BIGINT UNSIGNED NOT NULL DEFAULT '0',
  `guild_kills` INT UNSIGNED NOT NULL DEFAULT '0',
  `enemy_kills` INT UNSIGNED NOT NULL DEFAULT '0',
  `status` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `status` (`status`),
  KEY `guild_id` (`guild_id`),
  KEY `enemy_id` (`enemy_id`)
) ENGINE=InnoDB;
 
Ive already added this to database,
its still not working.

ps. its only doing it with the accept command

PHP:
[Error - TalkAction Interface]
data/talkactions/scripts/war/war.lua:onSay
Description:
data/talkactions/scripts/war/war.lua:70: attempt to call global 'doGuildAddEnemy
' (a nil value)
stack traceback:
        data/talkactions/scripts/war/war.lua:70: in function <data/talkactions/s
cripts/war/war.lua:1>

PHP:
data/talkactions/scripts/war/war.lua:70: attempt to call global 'doGuildAddEnemy
' (a nil value)

This is the Line in the script with doGuildAddEnemy:

PHP:
		query = query .. " WHERE `id` = " .. tmp:getDataInt("id")
		if(t[1] == "accept") then
			doGuildAddEnemy(guild, enemy, tmp:getDataInt("id"), WAR_GUILD)
			doGuildAddEnemy(enemy, guild, tmp:getDataInt("id"), WAR_ENEMY)

Still need help with it.
 
Come On BUMP!

- - - Updated - - -

It says -
You also have to compile TFS 0.3.7 (best pick would be latest revision) with -
D__WAR_SYSTEM__.
On a Windows machine to compile open project in Dev-Cpp, press ALT+P find there 'C++ Compiler' in one of the tabs and add there -D__WAR_SYSTEM__. Rebuild.
On a Linux open configure.ac find OPTIONAL_FLAGS="" and there add -D__WAR_SYSTEM__ so it looks like this: OPTIONAL_FLAGS="-D__WAR_SYSTEM__". Now type make clean && make -j 5.

Can somebody explain it to me? what do i have to open and do etc...
 
I have got the Same problem ;(
System: Windows
TFS: 0.4.1
Compiled with GNU C++ Version 3.4.5

If somebody could Help me, and the user above, Then that would be great.

Kind Regards,
X_Anero

- - - Updated - - -

Bump, Come on... Somebody ?
 
there must be somebody that can help me with this.

I really need help.
Ill try my hardest in trying to solve this problem too.
but i need help

- - - Updated - - -

when i type this in
/war accept,guild name Accept the invitation to start a war.
it doesn't accept and give out this error in console:
[Error - TalkAction Interface]
PHP:
data/talkactions/scripts/war/war.lua:onSay 
Description: 
data/talkactions/scripts/war/war.lua:70: attempt to call global 'doGuildAddEnemy 
' (a nil value) 
stack traceback: 
        data/talkactions/scripts/war/war.lua:70: in function <data/talkactions/s 
cripts/war/war.lua:1>
 
SOOOO....

I Need to Add -D__WAR_SYSTEM__ in ALT+P -> Parameters -> C++ Compiler params and then recompile
In dev-c++

but where do i add it, what do i open . (Example. Open tfs with dev-c++ then press ALT+P etc)
Come on, i have been dealing with this problem for a week now.

Rep++ for Help

Kind Regards,
X_anero
 
SOOOO....

I Need to Add -D__WAR_SYSTEM__ in ALT+P -> Parameters -> C++ Compiler params and then recompile
In dev-c++

but where do i add it, what do i open . (Example. Open tfs with dev-c++ then press ALT+P etc)
Come on, i have been dealing with this problem for a week now.

Rep++ for Help

Kind Regards,
X_anero

9plsug.png
 
Back
Top