mirror of
https://github.com/EQEmu/Server.git
synced 2025-12-11 21:01:29 +00:00
442 lines
10 KiB
C++
442 lines
10 KiB
C++
#include <wx/wx.h>
|
|
#include <mysql.h>
|
|
#include <vector>
|
|
#include "tasks.h"
|
|
#include "utility.h"
|
|
#include "items.h"
|
|
#include "base.h"
|
|
#include "ErrorLog.h"
|
|
|
|
using namespace std;
|
|
|
|
bool MainFrame::GetDatabaseSettings(){
|
|
FILE *mFile = NULL;
|
|
mFile = fopen("db.txt", "r");
|
|
|
|
//very little error checking
|
|
//we don't make sure the values in the file are valid
|
|
//or all there just that the file exists so:
|
|
//don't fuck this up.
|
|
if(mFile){
|
|
//this isn't all that safe
|
|
char chunk[256];
|
|
memset(chunk, 0, 256);
|
|
|
|
fgets(chunk, 256, mFile);
|
|
strcpy(server, chunk);
|
|
for(int i = 0; i<256; i++){
|
|
if(server[i] == '\n')
|
|
server[i] = '\0';
|
|
}
|
|
memset(chunk, 0, 256);
|
|
|
|
fgets(chunk, 256, mFile);
|
|
strcpy(database, chunk);
|
|
for(int i = 0; i<256; i++){
|
|
if(database[i] == '\n')
|
|
database[i] = '\0';
|
|
}
|
|
memset(chunk, 0, 256);
|
|
|
|
fgets(chunk, 256, mFile);
|
|
strcpy(user, chunk);
|
|
for(int i = 0; i<256; i++){
|
|
if(user[i] == '\n')
|
|
user[i] = '\0';
|
|
}
|
|
memset(chunk, 0, 256);
|
|
|
|
fgets(chunk, 256, mFile);
|
|
strcpy(password, chunk);
|
|
for(int i = 0; i<256; i++){
|
|
if(password[i] == '\n')
|
|
password[i] = '\0';
|
|
}
|
|
memset(chunk, 0, 256);
|
|
}
|
|
else{
|
|
mErrorLog->Log(eqEmuLogBoth, "Error opening file db.txt, could not read db settings.");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool MainFrame::LoadItems(){
|
|
if(mMysql){
|
|
mErrorLog->Log(eqEmuLogBoth, "Loading Items...");
|
|
unsigned int itemsLoaded = 0;
|
|
MYSQL_RES *res;
|
|
MYSQL_ROW row;
|
|
|
|
if (mysql_query(mMysql, "SELECT name,id FROM items")) {
|
|
mErrorLog->Log(eqEmuLogBoth, "MySQL Connection Error: %s", mysql_error(mMysql));
|
|
return false;
|
|
}
|
|
res = mysql_use_result(mMysql);
|
|
while ((row = mysql_fetch_row(res)) != NULL){
|
|
eqitem newIT;
|
|
strcpy(newIT.name, row[0]);
|
|
newIT.id = atoi(row[1]);
|
|
itemList.push_back(newIT);
|
|
itemsLoaded++;
|
|
}
|
|
mErrorLog->Log(eqEmuLogBoth, "%u Successfully Loaded Items", itemsLoaded);
|
|
mysql_free_result(res);
|
|
}
|
|
else{
|
|
mErrorLog->Log(eqEmuLogBoth, "Mysql connection did not exist for item load.");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool MainFrame::LoadZones()
|
|
{
|
|
if(mMysql){
|
|
mErrorLog->Log(eqEmuLogBoth, "Loading Zones...");
|
|
unsigned int zonesLoaded = 0;
|
|
MYSQL_RES *res;
|
|
MYSQL_ROW row;
|
|
|
|
if (mysql_query(mMysql, "SELECT short_name,zoneidnumber FROM zone")) {
|
|
mErrorLog->Log(eqEmuLogBoth, "MySQL Connection Error: %s", mysql_error(mMysql));
|
|
return false;
|
|
}
|
|
|
|
wxString zoneStr;
|
|
zoneStr.Printf("**Unknown Zone**");
|
|
int * id = new int;
|
|
*id = -1;
|
|
mStartZone->Append(zoneStr, (void*)id);
|
|
|
|
zoneStr.Clear();
|
|
zoneStr.Printf("*Any Zone*");
|
|
id = new int;
|
|
*id = 0;
|
|
mStartZone->Append(zoneStr, (void*)id);
|
|
|
|
mActivityZone->Append(zoneStr, (void*)id);
|
|
mProxZone->Append(zoneStr, (void*)id);
|
|
zoneStr.clear();
|
|
mStartZone->Select(0);
|
|
mActivityZone->Select(0);
|
|
mProxZone->Select(0);
|
|
|
|
res = mysql_use_result(mMysql);
|
|
while ((row = mysql_fetch_row(res)) != NULL){
|
|
eqtask_zones newZ;
|
|
strcpy(newZ.name, row[0]);
|
|
|
|
newZ.id = atoi(row[1]);
|
|
taskZoneList.push_back(newZ);
|
|
|
|
int * zoneId = new int;
|
|
*zoneId = newZ.id;
|
|
wxString zoneNameStr;
|
|
|
|
zoneNameStr.Printf("%s", newZ.name);
|
|
mStartZone->Append(zoneNameStr, (void*)zoneId);
|
|
mActivityZone->Append(zoneNameStr, (void*)zoneId);
|
|
mProxZone->Append(zoneNameStr, (void*)zoneId);
|
|
zoneNameStr.clear();
|
|
|
|
zonesLoaded++;
|
|
}
|
|
mErrorLog->Log(eqEmuLogBoth, "%u Successfully Loaded Zones", zonesLoaded);
|
|
mysql_free_result(res);
|
|
}
|
|
else{
|
|
mErrorLog->Log(eqEmuLogBoth, "Mysql connection did not exist for zone load.");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool MainFrame::LoadTasks()
|
|
{
|
|
if(mMysql){
|
|
mErrorLog->Log(eqEmuLogBoth, "Loading Tasks...");
|
|
unsigned int tasksLoaded = 0;
|
|
MYSQL_RES *res;
|
|
MYSQL_ROW row;
|
|
|
|
if (mysql_query(mMysql, "SELECT id, title, description, reward, rewardid, cashreward, xpreward, rewardmethod, startzone, duration, minlevel, maxlevel, repeatable FROM tasks")) {
|
|
mErrorLog->Log(eqEmuLogBoth, "MySQL Connection Error: %s", mysql_error(mMysql));
|
|
return false;
|
|
}
|
|
|
|
res = mysql_use_result(mMysql);
|
|
while ((row = mysql_fetch_row(res)) != NULL){
|
|
eqtask newT;
|
|
newT.id = atoi(row[0]);
|
|
|
|
//This isn't all that safe
|
|
//Working under the assumption that:
|
|
//Any database you connect to is not
|
|
//Going to want to hurt you
|
|
strcpy(newT.title, row[1]);
|
|
strcpy(newT.desc, row[2]);
|
|
strcpy(newT.reward, row[3]);
|
|
|
|
wxString str;
|
|
str.Printf("%d:%s", newT.id, newT.title);
|
|
ItemSelectionList->Append(str);
|
|
|
|
if(newT.id > highestIndex)
|
|
highestIndex = newT.id;
|
|
|
|
newT.rewardid = atoi(row[4]);
|
|
newT.cashreward = atoi(row[5]);
|
|
newT.xpreward = atoi(row[6]);
|
|
newT.rewardmethod = atoi(row[7]);
|
|
newT.startzone = atoi(row[8]);
|
|
newT.duration = atoi(row[9]);
|
|
newT.level_min = atoi(row[10]);
|
|
newT.level_max = atoi(row[11]);
|
|
newT.repeatable = atoi(row[12]) ? true : false;
|
|
|
|
taskList.push_back(newT);
|
|
|
|
tasksLoaded++;
|
|
}
|
|
mErrorLog->Log(eqEmuLogBoth, "%u Successfully Loaded Tasks", tasksLoaded);
|
|
mysql_free_result(res);
|
|
}
|
|
else{
|
|
mErrorLog->Log(eqEmuLogBoth, "Mysql connection did not exist for task load.");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool MainFrame::LoadGoals()
|
|
{
|
|
if(mMysql){
|
|
mErrorLog->Log(eqEmuLogBoth, "Loading Goals...");
|
|
unsigned int goalsLoaded = 0;
|
|
MYSQL_RES *res;
|
|
MYSQL_ROW row;
|
|
|
|
if (mysql_query(mMysql, "SELECT listid, entry FROM goallists")) {
|
|
mErrorLog->Log(eqEmuLogBoth, "MySQL Connection Error: %s", mysql_error(mMysql));
|
|
return false;
|
|
}
|
|
|
|
res = mysql_use_result(mMysql);
|
|
while ((row = mysql_fetch_row(res)) != NULL){
|
|
eqtask_goallist newGL;
|
|
newGL.id = atoi(row[0]);
|
|
newGL.value = atoi(row[1]);
|
|
goalTaskList.push_back(newGL);
|
|
|
|
goalsLoaded++;
|
|
}
|
|
mErrorLog->Log(eqEmuLogBoth, "%u Successfully Loaded Goals", goalsLoaded);
|
|
mysql_free_result(res);
|
|
}
|
|
else{
|
|
mErrorLog->Log(eqEmuLogBoth, "Mysql connection did not exist for goal load.");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool MainFrame::LoadActivities()
|
|
{
|
|
if(mMysql){
|
|
mErrorLog->Log(eqEmuLogBoth, "Loading Activities...");
|
|
unsigned int activitiesLoaded = 0;
|
|
MYSQL_RES *res;
|
|
MYSQL_ROW row;
|
|
|
|
if (mysql_query(mMysql, "SELECT taskid, activityid, step, activitytype, text1, text2, text3, goalid, goalmethod, goalcount, delivertonpc, zoneid, optional FROM activities")) {
|
|
mErrorLog->Log(eqEmuLogBoth, "MySQL Connection Error: %s", mysql_error(mMysql));
|
|
return false;
|
|
}
|
|
|
|
res = mysql_use_result(mMysql);
|
|
while ((row = mysql_fetch_row(res)) != NULL){
|
|
eqtask_activities newAL;
|
|
|
|
newAL.id = atoi(row[0]);
|
|
newAL.activityId = atoi(row[1]);
|
|
newAL.step = atoi(row[2]);
|
|
newAL.activityType = atoi(row[3]);
|
|
strcpy(newAL.text1, row[4]);
|
|
strcpy(newAL.text2, row[5]);
|
|
strcpy(newAL.text3, row[6]);
|
|
newAL.goalid = atoi(row[7]);
|
|
newAL.goalmethod = atoi(row[8]);
|
|
newAL.goalcount = atoi(row[9]);
|
|
newAL.deliverToNpc = atoi(row[10]);
|
|
newAL.zoneid = atoi(row[11]);
|
|
newAL.optional = atoi(row[12]) ? true : false;
|
|
|
|
taskActivitiesList.push_back(newAL);
|
|
activitiesLoaded++;
|
|
}
|
|
mErrorLog->Log(eqEmuLogBoth, "%u Successfully Loaded Activities", activitiesLoaded);
|
|
mysql_free_result(res);
|
|
}
|
|
else{
|
|
mErrorLog->Log(eqEmuLogBoth, "Mysql connection did not exist for activity load.");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
bool MainFrame::LoadProximity()
|
|
{
|
|
if(mMysql){
|
|
mErrorLog->Log(eqEmuLogBoth, "Loading Proximities...");
|
|
unsigned int proximitiesLoaded = 0;
|
|
MYSQL_RES *res;
|
|
MYSQL_ROW row;
|
|
|
|
if (mysql_query(mMysql, "SELECT zoneid, exploreid, minx, maxx, miny, maxy, minz, maxz FROM proximities")) {
|
|
mErrorLog->Log(eqEmuLogBoth, "MySQL Connection Error: %s", mysql_error(mMysql));
|
|
return false;
|
|
}
|
|
|
|
res = mysql_use_result(mMysql);
|
|
while ((row = mysql_fetch_row(res)) != NULL){
|
|
eqtask_proximity newPR;
|
|
|
|
newPR.zoneid = atoi(row[0]);
|
|
newPR.exploreid = atoi(row[1]);
|
|
newPR.minx = atof(row[2]);
|
|
newPR.maxx = atof(row[3]);
|
|
newPR.miny = atof(row[4]);
|
|
newPR.maxy = atof(row[5]);
|
|
newPR.minz = atof(row[6]);
|
|
newPR.maxz = atof(row[7]);
|
|
|
|
taskProximityList.push_back(newPR);
|
|
proximitiesLoaded++;
|
|
}
|
|
mErrorLog->Log(eqEmuLogBoth, "%u Successfully Loaded Proximities", proximitiesLoaded);
|
|
mysql_free_result(res);
|
|
}
|
|
else{
|
|
mErrorLog->Log(eqEmuLogBoth, "Mysql connection did not exist for proximity load.");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void MainFrame::ShowRewardChange(int rewardType, int rewardId)
|
|
{
|
|
if(rewardType == 2){
|
|
ShowRewardItems->Clear();
|
|
}
|
|
else if(rewardType == 0 && rewardId != 0){
|
|
ShowRewardItems->Clear();
|
|
vector<eqitem>::iterator Iter;
|
|
|
|
for(Iter = itemList.begin(); Iter!=itemList.end(); Iter++)
|
|
{
|
|
eqitem eqi = *Iter;
|
|
if(eqi.id == rewardId){
|
|
wxString itStr;
|
|
itStr.Printf("%u: %s", eqi.id, eqi.name);
|
|
ShowRewardItems->Append(itStr);
|
|
itStr.clear();
|
|
}
|
|
}
|
|
}
|
|
else if(rewardType == 1 && rewardId != 0)
|
|
{
|
|
ShowRewardItems->Clear();
|
|
vector<eqtask_goallist>::iterator Iter;
|
|
for(Iter = goalTaskList.begin(); Iter!=goalTaskList.end(); Iter++)
|
|
{
|
|
eqtask_goallist gli = *Iter;
|
|
if(gli.id == rewardId)
|
|
{
|
|
vector<eqitem>::iterator itemIter;
|
|
for(itemIter = itemList.begin(); itemIter!=itemList.end(); itemIter++)
|
|
{
|
|
eqitem eqi = *itemIter;
|
|
if(eqi.id == gli.value)
|
|
{
|
|
wxString itStr;
|
|
itStr.Printf("%u: %s", eqi.id, eqi.name);
|
|
ShowRewardItems->Append(itStr);
|
|
itStr.clear();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else{
|
|
ShowRewardItems->Clear();
|
|
}
|
|
}
|
|
|
|
void MainFrame::SetZoneSelectionById(int zid)
|
|
{
|
|
for(unsigned int x = 0; x < mStartZone->GetCount(); x++)
|
|
{
|
|
int *i;
|
|
i = (int*) mStartZone->GetClientData(x);
|
|
if(i){
|
|
if(*i == zid){
|
|
mStartZone->Select(x);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mErrorLog->Log(eqEmuLogBoth, "MainFrame::SetZoneSelectionById: i was NULL");
|
|
}
|
|
}
|
|
mStartZone->Select(0); //we have no valid zone
|
|
}
|
|
|
|
void MainFrame::SetZoneSelectionByIdActivity(int zid)
|
|
{
|
|
for(unsigned int x = 0; x < mActivityZone->GetCount(); x++)
|
|
{
|
|
int *i;
|
|
i = (int*) mActivityZone->GetClientData(x);
|
|
if(i){
|
|
if(*i == zid){
|
|
mActivityZone->Select(x);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mErrorLog->Log(eqEmuLogBoth, "MainFrame::SetZoneSelectionByIdActivity: i was NULL");
|
|
}
|
|
}
|
|
mActivityZone->Select(0); //we have no valid zone
|
|
}
|
|
|
|
void MainFrame::SetZoneSelectionByIdProximity(int zid)
|
|
{
|
|
for(unsigned int x = 0; x < mProxZone->GetCount(); x++)
|
|
{
|
|
int *i;
|
|
i = (int*) mProxZone->GetClientData(x);
|
|
if(i){
|
|
if(*i == zid){
|
|
mProxZone->Select(x);
|
|
return;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
mErrorLog->Log(eqEmuLogBoth, "MainFrame::SetZoneSelectionByIdProximity: i was NULL");
|
|
}
|
|
}
|
|
mProxZone->Select(0); //we have no valid zone
|
|
}
|
|
|
|
wxString MainFrame::MakeStringSQLSafe(const char * c)
|
|
{
|
|
wxString ret;
|
|
ret.Printf("%s", c);
|
|
ret.Replace("\'", "\\\'");
|
|
return ret;
|
|
} |