mangos/contrib/convertConditions/ConvertConditions.py
PargeLenis 76b2ee5e99
[Core/vmap] Standardise functions and codestyle (#181)
* Removed deprecated docker build

* [Core] Several codestyle/standardization fixes

* [vmap] Remove unused functions

* [core/vmap] Standardise functions and codestyle

* [Docker] Cmake double install fix

Co-authored-by: PargeLenis <dead.man.walkin@hotmail.de>
2022-10-19 10:55:19 +01:00

333 lines
13 KiB
Python

#
# This code is part of MaNGOS. Contributor & Copyright details are in AUTHORS/THANKS.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
import MySQLdb as mdb
import sys
#global Variables (change as required)
host = "localhost"
user = "mangos"
passw = "mangos"
# databases format: list of [name, expansion]
databases = [ ["mangos", 2] ]
#databases = [ ["zero_db", 0], ["tbcdb", 1], ["udb_clean", 2], ["ytdb", 2] ]
# Should the current conditions table be loaded? (usefull for appending custom content)
loadOldConditions = 0
# database, from which the conditions table will be loaded
database = databases[0][0]
#database = "mangos_custom"
# be very chatty with debug output
debug = 0
# global variables for internal use
false = 0
true = 1
processNumConditions = 0
fUpdates = 0
# Some Helper functions, main code at the bottom
def isSameCondition(c1, v11, v12, c2, v21, v22):
return (c1 == c2) and (v11 == v21) and (v12 == v22)
#
def compareCondition(c1, v11, v12, c2, v21, v22):
if (c1 > c2):
return true
if (c1 == c2):
if (v11 > v21):
return true
if (v11 == v21):
if (v12 > v22):
return true
return false
#
def insertCondition(c, v1, v2):
global old_max
old_max = old_max + 1
linkedList.append( [old_max, c, v1, v2, database] )
if (debug):
print "Inserted: [%d, %d, %d, %d], (%s)" % (old_max, c, v1, v2, database)
#
def findCondition(c, v1, v2):
for entry in linkedList:
if (isSameCondition(c, v1, v2, entry[1], entry[2], entry[3])):
return entry[0]
return 0
#
# Function that processes table tableName for keys keyName1, keyName2, parses the conditions of conditionString, which must select numberOfConditions conditions
def progressTable(tableName, keyName1, keyName2, conditionString, numberOfConditions):
global old_max
global processNumConditions
global fUpdates
try:
con = mdb.connect(host, user, passw, database);
cur = con.cursor()
cur.execute('SELECT %s, %s, %s FROM %s; ' % (keyName1, keyName2, conditionString, tableName))
result = cur.fetchall()
if (debug):
print 'ProgressTable %s in database %s' % (tableName, database)
for row in result:
key1 = row[0]
key2 = row[1]
c1 = v11 = v12 = c2 = v21 = v22 = c3= v31 =v32 = 0
c1 = row[2]
v11 = row[3]
v12 = row[4]
if (numberOfConditions >= 2):
c2 = row[5]
v21 = row[6]
v22 = row[7]
if (numberOfConditions >= 3):
c3 = row[8]
v31 = row[9]
v32 = row[10]
# Order the conditions of one row from big to slow
if (numberOfConditions >= 2) and (compareCondition(c2, v21, v22, c1, v11, v12)):
c1, v11, v12, c2, v21, v22 = c2, v21, v22, c1, v11, v12
if (numberOfConditions >= 3):
if (compareCondition(c3, v31, v32, c2, v21, v22)):
c2, v21, v22, c3, v31, v32 = c3, v31, v32, c2, v21, v22
if (compareCondition(c2, v21, v22, c1, v11, v12)):
c1, v11, v12, c2, v21, v22 = c2, v21, v22, c1, v11, v12
# How many conditions do we have?
rowConditionNumber = 0
if (c1 > 0):
rowConditionNumber = rowConditionNumber + 1
if (c2 > 0):
rowConditionNumber = rowConditionNumber + 1
if (c3 > 0):
rowConditionNumber = rowConditionNumber + 1
if (rowConditionNumber == 0): #nothing to do
continue;
if (debug):
print "Condition(s) for Key (%d, %d): %d, %d, %d -- %d, %d, %d -- %d, %d, %d" % (key1, key2, c1, v11, v12, c2, v21, v22, c3, v31, v32)
# Just insert
if (processNumConditions == 0):
if (rowConditionNumber >= 1 and findCondition(c1, v11, v12) == 0):
insertCondition(c1, v11, v12)
if (rowConditionNumber >= 2 and findCondition(c2, v21, v22) == 0):
insertCondition(c2, v21, v22)
if (rowConditionNumber >= 3 and findCondition(c3, v31, v32) == 0):
insertCondition(c3, v31, v32)
continue
#
# Currently processing?
if (processNumConditions != rowConditionNumber):
continue
founds = [0, 0, 0]
countFound = 0 # helper for error
if (rowConditionNumber >= 1):
founds[0] = findCondition(c1, v11, v12)
if (founds[0] > 0):
countFound = countFound + 1
if (rowConditionNumber >= 2):
founds[1] = findCondition(c2, v21, v22)
if (founds[1] > 0):
countFound = countFound + 1
if (rowConditionNumber >= 3):
founds[2] = findCondition(c3, v31, v32)
if (founds[2] > 0):
countFound = countFound + 1
if (countFound != rowConditionNumber):
print 'An error happened for: Condition(s) for Key (%d, %d): %d, %d, %d -- %d, %d, %d -- %d, %d, %d' % (key1, key2, c1, v11, v12, c2, v21, v22, c3, v31, v32)
continue
last_point = 0
#3-vector condition
if (rowConditionNumber == 3):
# search for 2 match
notSearched = [0, 0, 0]
notSearched[2] = findCondition(-1, founds[0], founds[1])
if (notSearched[2] == 0):
notSearched[2] = findCondition(-1, founds[1], founds[0])
notSearched[1] = findCondition(-1, founds[0], founds[2])
if (notSearched[1] == 0):
notSearched[1] = findCondition(-1, founds[2], founds[0])
notSearched[0] = findCondition(-1, founds[1], founds[2])
if (notSearched[0] == 0):
notSearched[0] = findCondition(-1, founds[2], founds[1])
if (notSearched == [0, 0, 0]): # nothing found
insertCondition(-1, founds[1], founds[2])
notSearched[0] = old_max
for i in range(0, 3):
if (notSearched[i] > 0):
last_point = findCondition(-1, notSearched[i], founds[i])
if (last_point == 0):
last_point = findCondition(-1, founds[i], notSearched[i])
if (last_point > 0):
break
if (last_point == 0):
for i in range(0, 3):
if (notSearched[i] > 0):
insertCondition(-1, founds[i], notSearched[i])
last_point = old_max
break
#2-vector condition
if (rowConditionNumber == 2):
# search for 2 match
last_point = findCondition(-1, founds[1], founds[0])
if (last_point == 0):
last_point = findCondition(-1, founds[0], founds[1])
if (last_point == 0):
#Not found, insert list
insertCondition(-1, founds[1], founds[0])
last_point = old_max
#1-vector condition
if (rowConditionNumber == 1):
last_point = founds[0]
# Now we must have last_point > 0 (for a condition), and linking to proper place
if (last_point > 0 and processNumConditions > 0):
#cur.execute('UPDATE %s SET condition_id=%d WHERE %s=%d AND %s=%d; ' % (tableName, last_point, keyName1, key1, keyName2, key2))
print >> fUpdates, 'UPDATE %s SET condition_id=%d WHERE %s=%d AND %s=%d;' % (tableName, last_point, keyName1, key1, keyName2, key2)
except mdb.Error, e:
print 'Error %d, %s' % (e.args[0], e.args[1])
sys.exit(1)
finally:
if con:
con.close()
## End of Helper function
linkedList = []
old_max = 0
linkedList.append( [0, 0, 0, 0, 'initial fill'] )
# Extract old conditions
if (loadOldConditions):
try:
con = mdb.connect(host, user, passw, database);
cur = con.cursor()
cur.execute('SELECT condition_entry, type, value1, value2 FROM conditions')
for row in cur:
linkedList.append( [row[0], row[1], row[2], row[3], 'reloaded from %s' % database ] )
old_max = old_max + 1
if (row[0] != old_max):
print 'An error happened at old_max=%d, entry=%d' % (old_max, row[0])
print 'Loaded %d values from %s conditions table' % (old_max, database)
except mdb.Error, e:
print 'Error %d, %s' % (e.args[0], e.args[1])
sys.exit(1)
finally:
if con:
con.close()
#
start_entry=old_max
def doTables(db):
global processNumConditions
global fUpdates
global database
database = db[0]
print 'Processing database %s (%d vector conditions)' % (database, processNumConditions)
try:
if (processNumConditions == 0):
fUpdates = open("%s_updates.sql" % database, "w")
else:
fUpdates = open("%s_updates.sql" % database, "a")
if (processNumConditions <= 1):
progressTable("reference_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
progressTable("creature_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
progressTable("gameobject_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
progressTable("pickpocketing_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
progressTable("item_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
progressTable("fishing_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
progressTable("skinning_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
progressTable("disenchant_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
progressTable("mail_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
# Not all expansions have all tables
if (db[1] >= 1):
progressTable("prospecting_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
if (db[1] >= 2):
progressTable("spell_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
progressTable("milling_loot_template", "entry", "item", "lootcondition, condition_value1, condition_value2", 1)
if (processNumConditions < 3):
progressTable("gossip_menu", "entry", "text_id", "cond_1, cond_1_val_1, cond_1_val_2, cond_2, cond_2_val_1, cond_2_val_2", 2)
progressTable("gossip_menu_option", "menu_id", "id", "cond_1, cond_1_val_1, cond_1_val_2, cond_2, cond_2_val_1, cond_2_val_2, cond_3, cond_3_val_1, cond_3_val_2", 3)
except:
print "An error happened here"
sys.exit(1)
finally:
fUpdates.close()
# end of helper function doTables
try:
fConditions = open("conditions_dump.sql", "w")
if (debug):
print 'Opened conditions_dump.sql successfully'
for i in range (0, 4):
processNumConditions = i
for db in databases:
doTables(db)
print 'Inserted %d rows for database %s' % (old_max - start_entry, database)
start_entry = old_max
print 'Processed database(s): %s' % databases
#create dump
print >> fConditions, 'TRUNCATE conditions;'
print >> fConditions, 'INSERT INTO conditions VALUES'
for i in range(1, old_max):
if (linkedList[i][0] != i):
print 'AN ERROR HAPPENED for i=%d, liLi[i].entry=%d' % (i, linkedList[i][0])
print >> fConditions, '(%d, %d, %d, %d), -- %s' % (linkedList[i][0], linkedList[i][1], linkedList[i][2], linkedList[i][3], linkedList[i][4])
i = old_max
print >> fConditions, '(%d, %d, %d, %d); -- %s' % (linkedList[i][0], linkedList[i][1], linkedList[i][2], linkedList[i][3], linkedList[i][4])
except:
print "An error happened"
sys.exit(1)
finally:
fConditions.close()