TFS 0.2 and 1.0 report bug system

Players can say !report SomeMessageHere to send a report to database, it will automatically fetch position of player etc. You can check reports in admin panel and change status of them, and optionally reward player with points if you feel they deserve it for reporting the bug.
Default working TFS 1.0 scripts for shop and firstitems
This commit is contained in:
Stefan Brannfjell 2014-03-10 08:10:03 +01:00
parent 0e90c050a8
commit dfce8d97dd
9 changed files with 302 additions and 1 deletions

View File

@ -0,0 +1,4 @@
Step 1: Copy firstitems.lua to /data/creaturescripts/scripts/ folder
-- Edit firstitems.lua with item IDs you want characters to start with on your server.
Step 2: Restart OT server, and it should work. :)

View File

@ -0,0 +1,77 @@
function onLogin(cid)
local storage = 30055 -- storage value
local sorcItems = {
2460, -- Brass helmet
2465, -- Brass armor
2190, -- Wand of vortex
2511, -- Brass shield
2478, -- Brass legs
2643, -- Leather boots
1988, -- Brown backpack
2050 -- torch
}
local druidItems = {
2460, -- Brass helmet
2465, -- Brass armor
2511, -- Brass shield
2182, -- Snakebite rod
2478, -- Brass legs
2643, -- Leather boots
1988, -- Brown backpack
2050 -- torch
}
local pallyItems = {
2460, -- Brass helmet
2465, -- Brass armor
2456, -- Bow
2478, -- Brass legs
2643, -- Leather boots
1988, -- Brown backpack
}
local kinaItems = {
2460, -- Brass helmet
2465, -- Brass armor
2511, -- Brass shield
2412, -- Katana
2478, -- Brass legs
2643, -- Leather boots
1988, -- Brown backpack
2050 -- torch
}
if getPlayerStorageValue(cid, storage) == -1 then
setPlayerStorageValue(cid, storage, 1)
if getPlayerVocation(cid) == 1 then
-- Sorcerer
for i = 1, table.getn(sorcItems), 1 do
doPlayerAddItem(cid, sorcItems[i], 1, FALSE)
end
elseif getPlayerVocation(cid) == 2 then
-- Druid
for i = 1, table.getn(druidItems), 1 do
doPlayerAddItem(cid, druidItems[i], 1, FALSE)
end
elseif getPlayerVocation(cid) == 3 then
-- Paladin
for i = 1, table.getn(pallyItems), 1 do
doPlayerAddItem(cid, pallyItems[i], 1, FALSE)
end
-- 8 arrows
doPlayerAddItem(cid, 2544, 8, FALSE)
elseif getPlayerVocation(cid) == 4 then
-- Knight
for i = 1, table.getn(kinaItems), 1 do
doPlayerAddItem(cid, kinaItems[i], 1, FALSE)
end
end
-- Common for all
doPlayerAddItem(cid, 2674, 5, FALSE) -- 5 apples
doPlayerAddItem(cid, 2120, 1, FALSE) -- 1 rope
end
return true
end

View File

@ -0,0 +1,20 @@
-- <talkaction words="!report" separator=" " script="adminreport.lua"/>
function onSay(cid, words, param, channel)
local storage = 6708 -- (You can change the storage if its already in use)
local delaytime = 30 -- (Exhaust In Seconds.)
local x = getPlayerPosition(cid).x -- (Do not edit this.)
local y = getPlayerPosition(cid).y -- (Do not edit this.)
local z = getPlayerPosition(cid).z -- (Do not edit this.)
if(param == '') then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "Command param required.")
return true
end
if (getPlayerStorageValue(cid, storage) <= os.time()) then
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Your report has been received successfully!")
db.query("INSERT INTO `player_reports` (`id` ,`name` ,`posx` ,`posy` ,`posz` ,`report_description` ,`date`)VALUES (NULL , '" .. getPlayerName(cid) .. "', '" .. x .. "', '" .. y .. "', '" .. z .. "', '" .. string.gsub(param, "'", "\\'") .. "', '" .. os.time() .. "')")
setPlayerStorageValue(cid,storage,os.time()+delaytime)
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You have to wait 30 seconds to report again.")
end
return TRUE
end

View File

@ -0,0 +1 @@
<talkaction words="!shop" script="znoteshop.lua"/>

View File

@ -0,0 +1,49 @@
-- Znote Shop v1.0 for Znote AAC on TFS 0.2.13+ Mystic Spirit.
function onSay(cid, words, param)
local storage = 54073 -- Make sure to select non-used storage. This is used to prevent SQL load attacks.
local cooldown = 15 -- in seconds.
if getPlayerStorageValue(cid, storage) <= os.time() then
setPlayerStorageValue(cid, storage, os.time() + cooldown)
local accid = getAccountNumberByPlayerName(getCreatureName(cid))
-- Create the query
local orderQuery = db.storeQuery("SELECT `id`, `type`, `itemid`, `count` FROM `znote_shop_orders` WHERE `account_id` = " .. accid .. " LIMIT 1;")
-- Detect if we got any results
if orderQuery ~= false then
-- Fetch order values
local q_id = result.getDataInt(orderQuery, "id")
local q_type = result.getDataInt(orderQuery, "type")
local q_itemid = result.getDataInt(orderQuery, "itemid")
local q_count = result.getDataInt(orderQuery, "count")
result.free(orderQuery)
-- ORDER TYPE 1 (Regular item shop products)
if q_type == 1 then
-- Get wheight
local playerCap = getPlayerFreeCap(cid)
local itemweight = getItemWeight(q_itemid, q_count)
if playerCap >= itemweight then
db.query("DELETE FROM `znote_shop_orders` WHERE `id` = " .. q_id .. ";")
doPlayerAddItem(cid, q_itemid, q_count)
doPlayerSendTextMessage(cid, MESSAGE_INFO_DESCR, "Congratulations! You have recieved ".. q_count .." "..getItemName(q_itemid).."(s)!")
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "Need more CAP!")
end
end
-- Add custom order types here
-- Type 2 is reserved for premium days and is handled on website, not needed here.
-- Type 3 is reserved for character gender(sex) change and is handled on website as well.
-- So use type 4+ for custom stuff, like etc packages.
-- if q_type == 4 then
-- end
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_WARNING, "You have no orders.")
end
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Can only be executed once every "..cooldown.." seconds. Remaining cooldown: ".. getPlayerStorageValue(cid, storage) - os.time())
end
return false
end

136
admin_reports.php Normal file
View File

@ -0,0 +1,136 @@
<?php require_once 'engine/init.php';
protect_page(); admin_only($user_data);
include 'layout/overall/header.php';
// Report status types. When a player make new report it will be default to 0.
// Feel free to add/remove and change name/color of status types.
$statusTypes = array(
0 => '<font color="purple">Reported</font>',
1 => '<font color="darkblue">To-Do List</font>',
2 => '<font color="red">Confirmed bug</font>',
3 => '<font color="grey">Invalid</font>',
4 => '<font color="grey">Rejected</font>',
5 => '<font color="green"><b>Fixed</b></font>'
);
// Fetch data from SQL
$reportsData = mysql_select_multi("SELECT id, name, posx, posy, posz, report_description, date, status FROM znote_player_reports ORDER BY id DESC;");
// If sql data is not empty
if ($reportsData !== false) {
// Order reports array by ID for easy reference later on.
$reports = array();
for ($i = 0; $i < count($reportsData); $i++) $reports[$reportsData[$i]['id']] = $reportsData[$i];
}
// POST logic (Update report and give player points)
if (!empty($_POST)) {
// Fetch POST data
$playerName = getValue($_POST['playerName']);
$status = getValue($_POST['status']);
$price = getValue($_POST['price']);
$customPoints = getValue($_POST['customPoints']);
$reportId = getValue($_POST['id']);
if ($customPoints !== false) $price = (int)($price + $customPoints);
// Update SQL
mysql_update("UPDATE `znote_player_reports` SET `status`='$status' WHERE `id`='$reportId' LIMIT 1;");
// Update local array representation
$reports[$reportId]['status'] = $status;
// If we should give user price
if ($price > 0) {
$account = mysql_select_single("SELECT `a`.`id`, `a`.`email` FROM `accounts` AS `a`
INNER JOIN `players` AS `p` ON `p`.`account_id` = `a`.`id`
WHERE `p`.`name` = '$playerName' LIMIT 1;");
if ($account !== false) {
// transaction log
mysql_insert("INSERT INTO `znote_paypal` VALUES ('', '$reportId', 'report@admin.".$user_data['name']." to ".$account['email']."', '".$account['id']."', '0', '".$price."')");
// Process payment
$data = mysql_select_single("SELECT `points` AS `old_points` FROM `znote_accounts` WHERE `account_id`='".$account['id']."';");
// Give points to user
$new_points = $data['old_points'] + $price;
mysql_update("UPDATE `znote_accounts` SET `points`='$new_points' WHERE `account_id`='".$account['id']."'");
// Remind GM that he sent points to character
echo "<font color='green' size='5'>".$playerName." has been granted ".$price." points for his reports.</font>";
}
}
// GET logic (Edit report data and specify how many [if any] points to give to user)
} elseif (!empty($_GET)) {
// Fetch GET data
$action = getValue($_GET['action']);
$playerName = getValue($_GET['playerName']);
$reportId = getValue($_GET['id']);
// Fetch the report we intend to modify
$report = $reports[$reportId];
// Create html form
?>
<div style="width: 300px; margin: auto;">
<form action="admin_reports.php" method="POST">
Player: <a target="_BLANK" href="characterprofile.php?name=<?php echo $report['name']; ?>"><?php echo $report['name']; ?></a>
<input type="hidden" name="playerName" value="<?php echo $report['name']; ?>">
<input type="hidden" name="id" value="<?php echo $report['id']; ?>">
<br>Set status:
<select name="status">
<?php
foreach ($statusTypes as $sid => $sname) {
if ($sid != $report['status']) echo "<option value='$sid'>$sname</option>";
else echo "<option value='$sid' selected>$sname</option>";
}
?>
</select><br>
Give user points:
<select name="price">
<option value='0'>0</option>
<?php
foreach ($config['paypal_prices'] as $price) {
echo "<option value='$price'>$price</option>";
}
?>
</select> + <input name="customPoints" type="text" style="width: 50px;" placeholder="0"><br><br>
<input type="submit" value="Update Report" style="width: 100%;">
</form>
</div>
<?php
}
// If sql data is not empty
if ($reportsData !== false) {
// Render HTML
?>
<center>
<h1>Reports List</h1>
<table class="table tbl" border="0" cellspacing="1" cellpadding="4" width="100%">
<tr class="yellow">
<td><b><font color=white><center>Info</center></font></b></td>
<td><b><font color=white><center>Description</center></font></b></td>
</tr>
<?php
foreach ($reports as $report) {
?>
<tr>
<td width="38%"> <b>Report ID:</b> #<?php echo $report['id']; ?>
<br><b>Name:</b> <a href="characterprofile.php?name=<?php echo $report['name']; ?>"><?php echo $report['name']; ?></a>
<br><b>Position:</b> <input type="text" disabled value="/pos <?php echo $report['posx'].', '.$report['posy'].', '.$report['posz']; ?>">
<br><b>Reported:</b> <?php echo getClock($report['date'], true, true); ?>
<br><b>Status:</b> <?php echo $statusTypes[$report['status']]; ?>. <a href="?action=edit&name=<?php echo $report['name'].'&id='.$report['id']; ?>">Edit</a>
</td>
<td>
<center><?php echo $report['report_description']; ?></center>
</td>
</tr>
<?php
}
?>
</table>
</center>
<?php
} else echo "<h2>No reports submitted.</h2>";
include 'layout/overall/footer.php';
?>

View File

@ -21,7 +21,7 @@ if (empty($_POST) === false) {
if ($_POST['name'] === false) {
$errors[] = 'Your name can not contain more than 2 words.';
} else {
if (user_character_exist($_POST['name']) === true) {
if (user_character_exist($_POST['name']) !== false) {
$errors[] = 'Sorry, that character name already exist.';
}
if (!preg_match("/^[a-zA-Z_ ]+$/", $_POST['name'])) {

View File

@ -95,6 +95,17 @@ CREATE TABLE IF NOT EXISTS `znote_players` (
INSERT INTO `znote_players` (`player_id`, `created`, `hide_char`, `comment`) VALUES
('1', '$time', '0', '. . .');
CREATE TABLE IF NOT EXISTS `znote_player_reports` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`posx` int(6) NOT NULL,
`posy` int(6) NOT NULL,
`posz` int(6) NOT NULL,
`report_description` VARCHAR(255) NOT NULL,
`date` INT(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
CREATE TABLE IF NOT EXISTS `znote_shop` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`type` int(11) NOT NULL,

View File

@ -14,6 +14,9 @@
<li>
<a href='admin_skills.php'>Admin Skills</a>
</li>
<li>
<a href='admin_reports.php'>Admin Reports</a>
</li>
<?php
$new = 0;
$cat = 4; //Category ID for feedback section