fixed problems with case-sensitivety on different systems

- table-names are now lowercase
- includes from spl_autolaod_regsiter() are now lowercase
This commit is contained in:
Sarjuuk
2014-08-01 13:52:33 +02:00
parent 7d1ced3f8d
commit 78422b9130
20 changed files with 70 additions and 48 deletions

View File

@@ -963,7 +963,7 @@ class AjaxHandler
}
// hey, still here? you're not a Tauren/Nelf as bear or cat, are you?
return DB::Aowow()->selectCell('SELECT IF(?d == 1, IFNULL(displayIdA, displayIdH), IFNULL(displayIdH, displayIdA)) FROM ?_shapeshiftForm WHERE id = ?d', Util::sideByRaceMask(1 << ($char['race'] - 1)), $form);
return DB::Aowow()->selectCell('SELECT IF(?d == 1, IFNULL(displayIdA, displayIdH), IFNULL(displayIdH, displayIdA)) FROM ?_shapeshiftform WHERE id = ?d', Util::sideByRaceMask(1 << ($char['race'] - 1)), $form);
}

View File

@@ -22,7 +22,7 @@ require 'pages/genericPage.class.php';
// autoload List-classes, associated filters and pages
spl_autoload_register(function ($class) {
$class = str_replace('Filter', '', $class);
$class = strtolower(str_replace('Filter', '', $class));
if (class_exists($class)) // already registered
return;
@@ -30,19 +30,19 @@ spl_autoload_register(function ($class) {
if (preg_match('/[^\w]/i', $class)) // name should contain only letters
return;
if (strpos($class, 'List'))
if (strpos($class, 'list'))
{
if (!class_exists('BaseType'))
require 'includes/types/basetype.class.php';
if (file_exists(CWD.'includes/types/'.strtr($class, ['List' => '']).'.class.php'))
require 'includes/types/'.strtr($class, ['List' => '']).'.class.php';
if (file_exists(CWD.'includes/types/'.strtr($class, ['list' => '']).'.class.php'))
require 'includes/types/'.strtr($class, ['list' => '']).'.class.php';
return;
}
if (file_exists('pages/'.strtr($class, ['Page' => '']).'.php'))
require 'pages/'.strtr($class, ['Page' => '']).'.php';
if (file_exists('pages/'.strtr($class, ['page' => '']).'.php'))
require 'pages/'.strtr($class, ['page' => '']).'.php';
});

View File

@@ -55,7 +55,7 @@ class Loot
private function createStack($l) // issue: TC always has an equal distribution between min/max
{
if (empty($l['min']) || empty($l['max']) || $l['min'] <= $l['max'])
if (empty($l['min']) || empty($l['max']) || $l['max'] <= $l['min'])
return null;
$stack = [];

View File

@@ -849,7 +849,7 @@ class ItemList extends BaseType
{
$pieces = DB::Aowow()->select('
SELECT b.id AS ARRAY_KEY, b.name_loc0, b.name_loc2, b.name_loc3, b.name_loc6, b.name_loc8, GROUP_CONCAT(a.id SEPARATOR \':\') AS equiv
FROM aowow_items a, aowow_items b
FROM ?_items a, ?_items b
WHERE a.slotBak = b.slotBak AND a.itemset = b.itemset AND b.id IN (?a)
GROUP BY b.id;',
array_keys($itemset->pieceToSet)
@@ -1015,7 +1015,7 @@ class ItemList extends BaseType
// from Trinity
public function generateEnchSuffixFactor()
{
$rpp = DB::Aowow()->selectRow('SELECT * FROM ?_itemRandomPropPoints WHERE Id = ?', $this->curTpl['itemLevel']);
$rpp = DB::Aowow()->selectRow('SELECT * FROM ?_itemrandomproppoints WHERE Id = ?', $this->curTpl['itemLevel']);
if (!$rpp)
return 0;
@@ -1291,9 +1291,9 @@ class ItemList extends BaseType
$ire = DB::Aowow()->select('
SELECT i.id AS ARRAY_KEY_1, ire.id AS ARRAY_KEY_2, iet.chance, ire.*
FROM aowow_items i
FROM ?_items i
JOIN item_enchantment_template iet ON iet.entry = ABS(i.randomEnchant)
JOIN aowow_itemRandomEnchant ire ON IF(i.randomEnchant > 0, ire.id = iet.ench, ire.id = -iet.ench)
JOIN ?_itemRandomEnchant ire ON IF(i.randomEnchant > 0, ire.id = iet.ench, ire.id = -iet.ench)
WHERE i.id IN (?a)',
array_keys($this->templates)
);
@@ -1444,8 +1444,8 @@ class ItemList extends BaseType
class ItemListFilter extends Filter
{
private $ubFilter = []; // usable-by - limit weapon/armor selection per CharClass - itemClass => available itemsubclasses
private $extCostQuery = 'SELECT item FROM npc_vendor nv JOIN ?_itemExtendedCost iec ON iec.id = nv.extendedCost WHERE %s UNION
SELECT item FROM game_event_npc_vendor genv JOIN ?_itemExtendedCost iec ON iec.id = genv.extendedCost WHERE %1$s';
private $extCostQuery = 'SELECT item FROM npc_vendor nv JOIN ?_itemextendedcost iec ON iec.id = nv.extendedCost WHERE %s UNION
SELECT item FROM game_event_npc_vendor genv JOIN ?_itemextendedcost iec ON iec.id = genv.extendedCost WHERE %1$s';
public $extraOpts = []; // score for statWeights
public $wtCnd = [];

View File

@@ -9,7 +9,7 @@ class SkillList extends BaseType
public static $type = TYPE_SKILL;
public static $brickFile = 'skill';
protected $queryBase = 'SELECT *, id AS ARRAY_KEY FROM ?_skillLine sl';
protected $queryBase = 'SELECT *, id AS ARRAY_KEY FROM ?_skillline sl';
public function __construct($conditions = [])
{
@@ -40,7 +40,7 @@ class SkillList extends BaseType
name_loc6,
name_loc8
FROM
?_skillLine
?_skillline
WHERE
id = ?d',
$id

View File

@@ -442,7 +442,7 @@ class SpellList extends BaseType
2289 => [2289, 29415, 29418, 29419, 29420, 29421] // Bear - Tauren
);
if ($st = DB::Aowow()->selectRow('SELECT *, displayIdA as model1, displayIdH as model2 FROM ?_shapeshiftForms WHERE id = ?d', $effMV))
if ($st = DB::Aowow()->selectRow('SELECT *, displayIdA as model1, displayIdH as model2 FROM ?_shapeshiftforms WHERE id = ?d', $effMV))
{
foreach ([1, 2] as $i)
if (isset($subForms[$st['model'.$i]]))
@@ -1228,7 +1228,7 @@ class SpellList extends BaseType
{
if (empty($this->spellVars[$this->id]))
{
$spellVars = DB::Aowow()->SelectCell('SELECT vars FROM ?_spellVariables WHERE id = ?d', $this->curTpl['spellDescriptionVariableId']);
$spellVars = DB::Aowow()->SelectCell('SELECT vars FROM ?_spellvariables WHERE id = ?d', $this->curTpl['spellDescriptionVariableId']);
$spellVars = explode("\n", $spellVars);
foreach ($spellVars as $sv)
if (preg_match('/\$(\w*\d*)=(.*)/i', trim($sv), $matches))
@@ -1811,7 +1811,7 @@ spells / buffspells = {
$extra[$id] = array(
'id' => $id,
'tooltip' => $tTip[0],
'buff' => $buff[0],
'buff' => @$buff[0],
'spells' => $tTip[1],
'buffspells' => @$buff[1]
);

View File

@@ -108,7 +108,7 @@ class TitleList extends BaseType
$sources[12] = (new AchievementList(array(['id', $sources[12]])))->getSourceData();
if (!empty($sources[13]))
$sources[13] = DB::Aowow()->SELECT('SELECT *, Id AS ARRAY_KEY FROM ?_sourceStrings WHERE Id IN (?a)', $sources[13]);
$sources[13] = DB::Aowow()->SELECT('SELECT *, Id AS ARRAY_KEY FROM ?_sourcestrings WHERE Id IN (?a)', $sources[13]);
foreach ($this->sources as $Id => $src)
{

View File

@@ -20,7 +20,7 @@ class ZoneList extends BaseType
{
$data = [];
/*
UPDATE dbc.worldmaparea a, world.aowow_zones z SET yMax = `left`, xMax = top, yMin = `right`, xMin = bottom WHERE a.areaId = z.id;
UPDATE dbc.worldmaparea a, world.?_zones z SET yMax = `left`, xMax = top, yMin = `right`, xMin = bottom WHERE a.areaId = z.id;
LFG_TYPE_NONE = 0, // Internal use only
LFG_TYPE_DUNGEON = 1,

View File

@@ -32,12 +32,12 @@ class User
self::$dataKey = $_SESSION['dataKey'];
// check IP bans
if ($ipBan = DB::Aowow()->selectRow('SELECT count, unbanDate FROM ?_account_bannedIPs WHERE ip = ? AND type = 0', $_SERVER['REMOTE_ADDR']))
if ($ipBan = DB::Aowow()->selectRow('SELECT count, unbanDate FROM ?_account_bannedips WHERE ip = ? AND type = 0', $_SERVER['REMOTE_ADDR']))
{
if ($ipBan['count'] > CFG_FAILED_AUTH_COUNT && $ipBan['unbanDate'] > time())
return false;
else if ($ipBan['unbanDate'] <= time())
DB::Aowow()->query('DELETE FROM ?_account_bannedIPs WHERE ip = ?', $_SERVER['REMOTE_ADDR']);
DB::Aowow()->query('DELETE FROM ?_account_bannedips WHERE ip = ?', $_SERVER['REMOTE_ADDR']);
}
// try to restore session
@@ -186,11 +186,11 @@ class User
case AUTH_MODE_SELF:
{
// handle login try limitation
$ip = DB::Aowow()->selectRow('SELECT ip, count, unbanDate FROM ?_account_bannedIPs WHERE type = 0 AND ip = ?', $_SERVER['REMOTE_ADDR']);
$ip = DB::Aowow()->selectRow('SELECT ip, count, unbanDate FROM ?_account_bannedips WHERE type = 0 AND ip = ?', $_SERVER['REMOTE_ADDR']);
if (!$ip || $ip['unbanDate'] < time()) // no entry exists or time expired; set count to 1
DB::Aowow()->query('REPLACE INTO ?_account_bannedIPs (ip, type, count, unbanDate) VALUES (?, 0, 1, UNIX_TIMESTAMP() + ?d)', $_SERVER['REMOTE_ADDR'], CFG_FAILED_AUTH_EXCLUSION);
DB::Aowow()->query('REPLACE INTO ?_account_bannedips (ip, type, count, unbanDate) VALUES (?, 0, 1, UNIX_TIMESTAMP() + ?d)', $_SERVER['REMOTE_ADDR'], CFG_FAILED_AUTH_EXCLUSION);
else // entry already exists; increment count
DB::Aowow()->query('UPDATE ?_account_bannedIPs SET count = count + 1, unbanDate = UNIX_TIMESTAMP() + ?d WHERE ip = ?', CFG_FAILED_AUTH_EXCLUSION, $_SERVER['REMOTE_ADDR']);
DB::Aowow()->query('UPDATE ?_account_bannedips SET count = count + 1, unbanDate = UNIX_TIMESTAMP() + ?d WHERE ip = ?', CFG_FAILED_AUTH_EXCLUSION, $_SERVER['REMOTE_ADDR']);
if ($ip && $ip['count'] >= CFG_FAILED_AUTH_COUNT && $ip['unbanDate'] >= time())
return AUTH_IPBANNED;
@@ -214,7 +214,7 @@ class User
return AUTH_ACC_INACTIVE;
// successfull auth; clear bans for this IP
DB::Aowow()->query('DELETE FROM ?_account_bannedIPs WHERE type = 0 AND ip = ?', $_SERVER['REMOTE_ADDR']);
DB::Aowow()->query('DELETE FROM ?_account_bannedips WHERE type = 0 AND ip = ?', $_SERVER['REMOTE_ADDR']);
if ($query['bans'] & (ACC_BAN_PERM | ACC_BAN_TEMP))
return AUTH_BANNED;

View File

@@ -83,7 +83,7 @@ class Util
);
/* why:
Because petSkills (and ranged weapon skills) are the only ones with more than two skillLines attached. Because Left Joining ?_spell with ?_skillLineAbility causes more trouble than it has uses.
Because petSkills (and ranged weapon skills) are the only ones with more than two skillLines attached. Because Left Joining ?_spell with ?_skillLineability causes more trouble than it has uses.
Because this is more or less the only reaonable way to fit all that information into one database field, so..
.. the indizes of this array are bits of skillLine2OrMask in ?_spell if skillLineId1 is negative
*/

View File

@@ -382,7 +382,7 @@ Markup.printHtml("description text here", "description-generic", { allow: Markup
return Lang::$account['emailInvalid'];
// limit account creation
$ip = DB::Aowow()->selectRow('SELECT ip, count, unbanDate FROM ?_account_bannedIPs WHERE type = 1 AND ip = ?', $_SERVER['REMOTE_ADDR']);
$ip = DB::Aowow()->selectRow('SELECT ip, count, unbanDate FROM ?_account_bannedips WHERE type = 1 AND ip = ?', $_SERVER['REMOTE_ADDR']);
if ($ip && $ip['count'] >= CFG_FAILED_AUTH_COUNT && $ip['unbanDate'] >= time())
{
DB::Aowow()->query('UPDATE ?_account_bannedips SET count = count + 1, unbanDate = UNIX_TIMESTAMP() + ?d WHERE ip = ? AND type = 1', CFG_FAILED_AUTH_EXCLUSION, $_SERVER['REMOTE_ADDR']);

View File

@@ -73,7 +73,7 @@ class AchievementsPage extends GenericPage
$curCats = $catList = [!empty($this->category) ? (int)end($this->category) : 0];
while ($curCats)
{
$curCats = DB::Aowow()->SelectCol('SELECT Id FROM ?_achievementCategory WHERE parentCategory IN (?a)', $curCats);
$curCats = DB::Aowow()->SelectCol('SELECT Id FROM ?_achievementcategory WHERE parentCategory IN (?a)', $curCats);
$catList = array_merge($catList, $curCats);
}
$conditions = [];

View File

@@ -215,9 +215,9 @@ class CurrencyPage extends GenericPage
}
$boughtBy = DB::Aowow()->selectCol('
SELECT item FROM npc_vendor nv JOIN ?_itemExtendedCost iec ON iec.id = nv.extendedCost WHERE '.$w.'
SELECT item FROM npc_vendor nv JOIN ?_itemextendedcost iec ON iec.id = nv.extendedCost WHERE '.$w.'
UNION
SELECT item FROM game_event_npc_vendor genv JOIN ?_itemExtendedCost iec ON iec.id = genv.extendedCost WHERE '.$w
SELECT item FROM game_event_npc_vendor genv JOIN ?_itemextendedcost iec ON iec.id = genv.extendedCost WHERE '.$w
);
if ($boughtBy)

View File

@@ -173,7 +173,7 @@ class ItemPage extends genericPage
// tool
if ($tId = $this->subject->getField('totemCategory'))
if ($tName = DB::Aowow()->selectRow('SELECT * FROM ?_totemCategory WHERE id = ?d', $tId))
if ($tName = DB::Aowow()->selectRow('SELECT * FROM ?_totemcategory WHERE id = ?d', $tId))
$infobox[] = Lang::$item['tool'].Lang::$main['colon'].'[url=?items&filter=cr=91;crs='.$tId.';crv=0]'.Util::localizedString($tName, 'name').'[/url]';
// extendedCost
@@ -825,9 +825,9 @@ class ItemPage extends genericPage
$w = 'iec.reqItemId1 = '.$this->typeId.' OR iec.reqItemId2 = '.$this->typeId.' OR iec.reqItemId3 = '.$this->typeId.' OR iec.reqItemId4 = '.$this->typeId.' OR iec.reqItemId5 = '.$this->typeId;
$boughtBy = DB::Aowow()->selectCol('
SELECT item FROM npc_vendor nv JOIN ?_itemExtendedCost iec ON iec.id = nv.extendedCost WHERE '.$w.'
SELECT item FROM npc_vendor nv JOIN ?_itemextendedcost iec ON iec.id = nv.extendedCost WHERE '.$w.'
UNION
SELECT item FROM game_event_npc_vendor genv JOIN ?_itemExtendedCost iec ON iec.id = genv.extendedCost WHERE '.$w
SELECT item FROM game_event_npc_vendor genv JOIN ?_itemextendedcost iec ON iec.id = genv.extendedCost WHERE '.$w
);
if ($boughtBy)
{

View File

@@ -342,9 +342,16 @@ class NpcPage extends GenericPage
// tab: teaches
if ($this->subject->getField('npcflag') & NPC_FLAG_TRAINER)
{
$teachQuery = 'SELECT IFNULL(t2.spell, t1.spell) AS ARRAY_KEY, IFNULL(t2.spellcost, t1.spellcost) AS cost, IFNULL(t2.reqskill, t1.reqskill) AS reqSkillId,
IFNULL(t2.reqskillvalue, t1.reqskillvalue) AS reqSkillValue, IFNULL(t2.reqlevel, t1.reqlevel) AS reqLevel
FROM npc_trainer t1 LEFT JOIN npc_trainer t2 ON t2.entry = IF(t1.spell < 0, -t1.spell, null) WHERE t1.entry = ?d';
$teachQuery = '
SELECT IFNULL(t2.spell, t1.spell) AS ARRAY_KEY,
IFNULL(t2.spellcost, t1.spellcost) AS cost,
IFNULL(t2.reqskill, t1.reqskill) AS reqSkillId,
IFNULL(t2.reqskillvalue, t1.reqskillvalue) AS reqSkillValue,
IFNULL(t2.reqlevel, t1.reqlevel) AS reqLevel
FROM npc_trainer t1
LEFT JOIN npc_trainer t2 ON t2.entry = IF(t1.spell < 0, -t1.spell, null)
WHERE t1.entry = ?d
';
if ($tSpells = DB::Aowow()->select($teachQuery, $this->typeId))
{
@@ -658,7 +665,7 @@ class NpcPage extends GenericPage
IF(f.id = RewOnKillRepFaction1, RewOnKillRepValue1, RewOnKillRepValue2) AS qty,
IF(f.id = RewOnKillRepFaction1, MaxStanding1, MaxStanding2) AS maxRank,
IF(f.id = RewOnKillRepFaction1, isTeamAward1, isTeamAward2) AS spillover
FROM aowow_factions f JOIN creature_onkill_reputation cor ON f.Id = cor.RewOnKillRepFaction1 OR f.Id = cor.RewOnKillRepFaction2 WHERE cor.creature_id IN (?a)';
FROM ?_factions f JOIN creature_onkill_reputation cor ON f.Id = cor.RewOnKillRepFaction1 OR f.Id = cor.RewOnKillRepFaction2 WHERE cor.creature_id IN (?a)';
foreach (DB::Aowow()->select($q, (array)$entries) as $_)
{

View File

@@ -133,7 +133,8 @@ class ObjectPage extends GenericPage
// SpellFocus
if ($_ = $this->subject->getField('spellFocusId'))
$infobox[] = '[tooltip name=focus]'.Lang::$gameObject['focusDesc'].'[/tooltip][span class=tip tooltip=focus]'.Lang::$gameObject['focus'].Lang::$main['colon'].Util::localizedString(DB::Aowow()->selectRow('SELECT * FROM ?_spellFocusObject WHERE id = ?d', $_), 'name').'[/span]';
if ($sfo = DB::Aowow()->selectRow('SELECT * FROM ?_spellfocusobject WHERE id = ?d', $_))
$infobox[] = '[tooltip name=focus]'.Lang::$gameObject['focusDesc'].'[/tooltip][span class=tip tooltip=focus]'.Lang::$gameObject['focus'].Lang::$main['colon'].Util::localizedString($sfo, 'name').'[/span]';
// lootinfo: [min, max, restock]
if (($_ = $this->subject->getField('lootStack')) && $_[0])

View File

@@ -805,7 +805,7 @@ class QuestPage extends GenericPage
if ($_ = $this->subject->getField('rewardMailTemplateId'))
{
$delay = $this->subject->getField('rewardMailDelay');
$letter = DB::Aowow()->selectRow('SELECT * FROM ?_mailTemplate WHERE id = ?d', $_);
$letter = DB::Aowow()->selectRow('SELECT * FROM ?_mailtemplate WHERE id = ?d', $_);
$mail = array(
'delay' => $delay ? sprintf(Lang::$quest['mailIn'], Util::formatTime($delay * 1000)) : null,

View File

@@ -258,7 +258,7 @@ class SkillPage extends GenericPage
$list = DB::Aowow()->selectCol('
SELECT IF(t1.entry > 200000, t2.entry, t1.entry)
FROM npc_trainer t1
JOIN aowow_spell s ON s.id = t1.spell
JOIN ?_spell s ON s.id = t1.spell
LEFT JOIN npc_trainer t2 ON t2.spell = -t1.entry
WHERE s.typeCat IN (-11, 9) AND (s.skillLine1 = ?d OR (s.skillLine1 > 0 AND s.skillLine2OrMask = ?d) '.($mask ? ' OR (s.skilllIne1 = -3 AND s.skillLine2OrMask = '.$mask.')' : null).')',
$this->typeId,

View File

@@ -156,7 +156,7 @@ class SpellPage extends GenericPage
// spell focus
if ($_ = $this->subject->getField('spellFocusObject'))
{
$bar = DB::Aowow()->selectRow('SELECT * FROM ?_spellFocusObject WHERE id = ?d', $_);
$bar = DB::Aowow()->selectRow('SELECT * FROM ?_spellfocusobject WHERE id = ?d', $_);
$focus = new GameObjectList(array(['spellFocusId', $_], 1));
$infobox[] = '[li]'.Lang::$game['requires2'].' '.($focus->error ? Util::localizedString($bar, 'name') : '[url=?object='.$focus->id.']'.Util::localizedString($bar, 'name').'[/url]').'[/li]';
}
@@ -1430,7 +1430,7 @@ class SpellPage extends GenericPage
private function createEffects(&$infobox, &$redButtons)
{
// proc data .. maybe use more information..?
$procData = DB::Aowow()->selectRow('SELECT IF(ppmRate > 0, -ppmRate, customChance) AS chance, cooldown FROM world.spell_proc_event WHERE entry = ?d', $this->typeId);
$procData = DB::Aowow()->selectRow('SELECT IF(ppmRate > 0, -ppmRate, customChance) AS chance, cooldown FROM spell_proc_event WHERE entry = ?d', $this->typeId);
if (!isset($procData['cooldown']))
$procData['cooldown'] = 0;
@@ -1569,7 +1569,7 @@ class SpellPage extends GenericPage
case 53: // Enchant Item Perm
case 54: // Enchant Item Temp
case 156: // Enchant Item Prismatic
if ($_ = DB::Aowow()->selectRow('SELECT * FROM ?_itemEnchantment WHERE id = ?d', $effMV))
if ($_ = DB::Aowow()->selectRow('SELECT * FROM ?_itemenchantment WHERE id = ?d', $effMV))
$foo['name'] .= ' <span class="q2">'.Util::localizedString($_, 'text').'</span> ('.$effMV.')';
else
$foo['name'] .= ' #'.$effMV;
@@ -1611,7 +1611,7 @@ class SpellPage extends GenericPage
$foo['name'] .= Lang::$main['colon'].$_;
break;
case 74: // Apply Glyph
if ($_ = DB::Aowow()->selectCell('SELECT spellId FROM ?_glyphProperties WHERE id = ?d', $effMV))
if ($_ = DB::Aowow()->selectCell('SELECT spellId FROM ?_glyphproperties WHERE id = ?d', $effMV))
{
if ($n = SpellList::getName($_))
$foo['name'] .= Lang::$main['colon'].'(<a href="?spell='.$_.'">'.$n.'</a>)';

View File

@@ -76,8 +76,22 @@ class ZonesPage extends GenericPage
if ($mapFile)
{
$somData = ['flightmaster' => []];
$nodes = DB::Aowow()->select('SELECT id AS ARRAY_KEY, tn.* FROM ?_taxiNodes tn WHERE mapId = ?d ', $spawnMap);
$paths = DB::Aowow()->select('SELECT IF(tn1.reactA = tn1.reactH AND tn2.reactA = tn2.reactH, 1, 0) AS neutral, tp.startNodeId AS startId, tn1.posX AS startPosX, tn1.posY AS startPosY, tp.endNodeId AS endId, tn2.posX AS endPosX, tn2.posY AS endPosY FROM ?_taxiPath tp, ?_taxiNodes tn1 , ?_taxiNodes tn2 WHERE tn1.Id = tp.endNodeId AND tn2.Id = tp.startNodeId AND (tp.startNodeId IN (?a) OR tp.EndNodeId IN (?a))', array_keys($nodes), array_keys($nodes));
$nodes = DB::Aowow()->select('SELECT id AS ARRAY_KEY, tn.* FROM ?_taxinodes tn WHERE mapId = ?d ', $spawnMap);
$paths = DB::Aowow()->select('
SELECT IF(tn1.reactA = tn1.reactH AND tn2.reactA = tn2.reactH, 1, 0) AS neutral,
tp.startNodeId AS startId,
tn1.posX AS startPosX,
tn1.posY AS startPosY,
tp.endNodeId AS endId,
tn2.posX AS endPosX,
tn2.posY AS endPosY
FROM ?_taxipath tp,
?_taxinodes tn1,
?_taxinodes tn2
WHERE tn1.Id = tp.endNodeId AND
tn2.Id = tp.startNodeId AND
(tp.startNodeId IN (?a) OR tp.EndNodeId IN (?a))
', array_keys($nodes), array_keys($nodes));
foreach ($nodes as $i => $n)
{