Merge and fix the loot update branch, ready for merge I think

This commit is contained in:
KimLS
2015-02-04 23:13:02 -08:00
738 changed files with 82418 additions and 58480 deletions
-16
View File
@@ -97,7 +97,6 @@ void repair_a_high_waypoint(Map *map, PathNode *it) {
}
} else {
z_no_map_count++;
//printf("Missed: (%.3f, %.3f, %.3f)\n", it->x, it->y, it->z);
}
}
@@ -199,8 +198,6 @@ RESTART_WP_REDUCE:
//we are removing the second one
wp_reduce_count++;
//printf("pos=%d/%d\n", pos, g->nodes.size());
//printf("trail = 0x%x(0x%x) (%.3f, %.3f, %.3f)\n",
// *trail, second, (*trail)->x, (*trail)->y, (*trail)->z);
//trail = cur2;
@@ -277,7 +274,6 @@ void break_long_lines(list<PathGraph*> &db_paths) {
if(len2 < cutlen2)
continue;
//printf("Cut (%.3f,%.3f,%.3f) -> (%.3f,%.3f,%.3f) d2=%.3f\n", e->from->x, e->from->y, e->from->z, e->to->x, e->to->y, e->to->z, len2);
float len = sqrt(len2);
v1.x = (e->to->x - e->from->x)/len;
@@ -297,7 +293,6 @@ void break_long_lines(list<PathGraph*> &db_paths) {
ee = new PathEdge(last_node, n);
last_node = n;
//printf(" (%.3f,%.3f,%.3f) -> (%.3f,%.3f,%.3f) d2=%.3f\n", ee->from->x, ee->from->y, ee->from->z, ee->to->x, ee->to->y, ee->to->z, e->from->Dist2(e->to));
g->edges.push_back(ee);
g->nodes.push_back(n);
@@ -967,7 +962,6 @@ run an algorithm to remove redundancy:
RESTART_GRID_CLEAN:
cur = big->nodes.begin();
end = big->nodes.end();
//printf("Starting clean at pos %d with %d nodes\n", cur_pos, big->nodes.size());
for(r = 0; r < cur_pos; r++)
cur++;
for(; cur != end; cur++, cur_pos++, stat++) {
@@ -989,16 +983,13 @@ RESTART_GRID_CLEAN:
if(n == f)
continue;
if(n->Dist2(f) > ce2) {
//printf("Dist %f, ce2 %f\n", n->Dist2(f), ce2);
continue;
}
//printf("Distbbb %f, ce2 %f, (%f,%f), (%f,%f)\n", n->Dist2(f), ce2, n->x, n->y, f->x, f->y);
#ifdef COMBINE_CHECK_ALL_LOS
//we should merge these. Now we wanna check to make sure combining
//them will not cause the old node's edges to become invalid.
//printf("Checking combine LOS on %d, with %d edges.\n", r, big->edges.size());
badlos = false;
if(node_edges.count(f) == 1) {
@@ -1618,7 +1609,6 @@ void count_crossing_lines(list<PathEdge *> &edges, PathGraph *out, PathGraph *ex
if(count >= CROSS_REDUCE_COUNT) {
//printf("Edge crosses %d edges.\n", count);
out->edges.push_back(e);
cross_edge_count++;
cross_list[e] = hits;
@@ -1847,7 +1837,6 @@ QTNode *build_quadtree(Map *map, PathGraph *big) {
end = _root->nodes.end();
//int findex = 0;
for(; curs != end; curs++) {
//printf("Started With node index %d (0x%x)\n", findex++, *curs);
}
_root->divideYourself(0);
@@ -1915,7 +1904,6 @@ bool write_path_file(QTNode *_root, PathGraph *big, const char *file, vector< ve
end = big->nodes.end();
int nn = 0;
for(; cur != end; cur++, curn++, nn++) {
//printf("Filling node %d/%d n=0x%x, lb=0x%x, curl=0x%x/0x%x\n", nn, index, *cur, linkBlock, curl, &linkBlock[eoffset]);
n = *cur;
if(n == NULL) {
printf("Got NULL node building quadtree, WTF.");
@@ -1926,7 +1914,6 @@ int nn = 0;
curn->z = n->z;
curn->link_offset = eoffset;
curn->distance = n->longest_path;
//printf("Node %d: (%.2f,%.2f,%.2f) LO %d, D %d\n", nn, curn->x, curn->y, curn->z, curn->link_offset, curn->distance);
int ecount = 0;
cur4 = big->edges.begin();
@@ -1939,7 +1926,6 @@ int nn = 0;
curl = &linkBlock[eoffset];
curl->dest_node = e->to->node_id;
curl->reach = e->normal_reach;
//printf("\tLinkFrom %d: dest %d, reach %d\n", eoffset, curl->dest_node, curl->reach);
from_edges[e] = ecount;
ecount++;
eoffset++;
@@ -1948,7 +1934,6 @@ int nn = 0;
curl = &linkBlock[eoffset];
curl->dest_node = e->from->node_id;
curl->reach = e->reverse_reach;
//printf("\tLinkTo %d: dest %d, reach %d\n", eoffset, curl->dest_node, curl->reach);
to_edges[e] = ecount;
ecount++;
eoffset++;
@@ -1959,7 +1944,6 @@ int nn = 0;
printf("ERROR: a node has more than %d links, number will be truncated!", PATH_LINK_OFFSET_NONE-1);
}
curn->link_count = ecount;
//printf("Used up to slot %d of %d in links\n", eoffset, head.link_count);
}
//write vertexBlock
-3
View File
@@ -297,7 +297,6 @@ void color_disjoint_graphs(
if(n->color != 0)
continue; //allready visited
//printf("New Color at: (%.3f,%.3f,%.3f)\n", n->x, n->y, n->z);
cc = 1;
djc = 0;
@@ -457,7 +456,6 @@ void calc_path_lengths(Map *map, MyGraph &vg, PathGraph *big, map<PathEdge *, Ed
int longest = longest_dists[n->node_id];
//n->longest_path = longest;
//printf("Node %d's longest path is %d\n", n->node_id, longest);
if(longest < shortest) {
shortest = longest;
@@ -476,7 +474,6 @@ printf("The tree's root is %d\n", shortest_node);
n->longest_path = 0;
else
n->longest_path = root_dists[n->node_id];
//printf("Node %d's distance from root is %d\n", n->node_id, root_dists[n->node_id]);
}
-4
View File
@@ -86,17 +86,14 @@ void QTNode::fillBlocks(PathTree_Struct *heads, PathPointRef *flist, unsigned lo
head->miny = miny;
head->maxy = maxy;
head->flags = 0;
//printf("Node %u: (%.2f -> %.2f, %.2f -> %.2f)\n", hindex-1, head->minx, head->maxx, head->miny, head->maxy);
//rearranged to give all QT nodes a node list
head->nodelist.count = nodes.size();
head->nodelist.offset = findex;
//printf(" Final node with %u nodes, list offset %lu.\n", head->nodes.count, head->nodes.offset);
list<PathNode *>::iterator curs,end;
curs = nodes.begin();
end = nodes.end();
for(; curs != end; curs++) {
//printf("Got to node index %d (0x%x)\n", findex, *curs);
PathNode *cur = *curs;
flist[findex] = cur->node_id;
findex++;
@@ -283,7 +280,6 @@ void QTNode::buildVertexes() {
}
bool QTNode::IsInNode(const QTNode *n, const PathNode *o) {
//printf("IIN: (%.3f,%.3f) in (%.3f -> %.3f, %.3f -> %.3f)\n", o->x, o->y, n->minx, n->maxx, n->miny, n->maxy);
if( o->x >= n->minx && o->x < n->maxx
&& o->y >= n->miny && o->y < n->maxy )
return(true);
-2
View File
@@ -257,7 +257,6 @@ long BSPCountNodes(BSP_Node *tree, long node_number) {
long BSPFindRegion(BSP_Node *tree, long node_number, long region) {
//printf("Find Region %ld in node %ld\n", region, node_number);
if(node_number<1) {
printf("Something went wrong\n");
exit(1);
@@ -329,7 +328,6 @@ long BSPFindNode(BSP_Node *tree, long node_number, float x, float y, float z) {
long BSPMarkRegion(BSP_Node *tree, long node_number, long region, int region_type) {
//printf("Find Region %ld in node %ld\n", region, node_number);
if(node_number<1) {
printf("Something went wrong\n");
exit(1);
-2
View File
@@ -584,12 +584,10 @@ void QTNode::fillBlocks(nodeHeader *heads, unsigned long *flist, unsigned long &
head->miny = miny;
head->maxy = maxy;
head->flags = 0;
//printf("Node %u: (%.2f -> %.2f, %.2f -> %.2f)\n", hindex-1, head->minx, head->maxx, head->miny, head->maxy);
if(final) {
head->flags |= nodeFinal;
head->faces.count = faces.size();
head->faces.offset = findex;
//printf(" Final node with %u faces, list offset %lu.\n", head->faces.count, head->faces.offset);
unsigned long r;
for(r = 0; r < head->faces.count; r++) {
flist[findex] = faces[r].index;
-2
View File
@@ -178,7 +178,6 @@ const char *PFSLoader::FindExtension(const char *ext) {
int elen = strlen(ext);
for(i = 0; i < this->count; ++i) {
//printf("Look for %s: got %s\n", ext, this->filenames[i]);
int flen = strlen(this->filenames[i]);
if(flen <= elen)
continue;
@@ -197,7 +196,6 @@ int PFSLoader::GetFile(char *name, uchar **buf, int *len) {
Lower(name);
for(i = 0; i < this->count; ++i) {
//printf("Look for %s: got %s\n", name, this->filenames[i]);
if(!strcmp(this->filenames[i], name)) {
fseek(this->fp, this->files[i], SEEK_SET);
fread(&s3d_dir, sizeof(struct_directory), 1, this->fp);
-4
View File
@@ -151,7 +151,6 @@ int line_count = 0;
var = (char *) buffer;
line_count++;
// printf("%s %s\n", val, var);
if(strlen(var) == 0 || strlen(val) == 0) {
++buffer;
@@ -166,7 +165,6 @@ int line_count = 0;
mlist[j].basetex = new char[val_len + 1];
memcpy(mlist[j].basetex, val, val_len + 1);
++mat_count;
// printf("%i: Basetex: %s\n", j + 1, mlist[j].basetex);
++j;
}
else if(val[0] != 'e' && val[1] != '_' && ((var[0] != 'e' && var[1] != '_') || !strcmp(val, "e_fShininess0"))) {
@@ -179,7 +177,6 @@ int line_count = 0;
memcpy(mlist[j].name, val, val_len + 1);
continue;
}
// printf("Named: %s\n", mlist[j].name);
}
buffer += var_len + 1;
@@ -321,7 +318,6 @@ printf("%d tris start at %d (0x%x)\n", zm->poly_count, (buffer-ter_orig), (buffe
}
zm->polys[j] = new Polygon;
//printf(" v1=%d, v2=%d, v3=%d, g=%d, unk=%d\n", ttri->v1, ttri->v2, ttri->v3, ttri->group, ttri->unk);
if(ttri->v1 >= zm->vert_count && errored < 10) {
printf("Tri %d/%d (s %d) @0x%x: invalid v1: %d >= %d\n", i, zm->poly_count, skipped, (buffer-ter_orig), ttri->v1, zm->vert_count);
-2
View File
@@ -271,7 +271,6 @@ long BSPCountNodes(BSP_Node *tree, long node_number) {
long BSPFindRegion(BSP_Node *tree, long node_number, long region) {
//printf("Find Region %ld in node %ld\n", region, node_number);
if(node_number<1) {
printf("Something went wrong\n");
exit(1);
@@ -343,7 +342,6 @@ long BSPFindNode(BSP_Node *tree, long node_number, float x, float y, float z) {
long BSPMarkRegion(BSP_Node *tree, long node_number, long region, int region_type) {
//printf("Find Region %ld in node %ld\n", region, node_number);
if(node_number<1) {
printf("Something went wrong\n");
exit(1);
-2
View File
@@ -447,12 +447,10 @@ void QTNode::fillBlocks(nodeHeader *heads, unsigned long *flist, unsigned long &
head->miny = miny;
head->maxy = maxy;
head->flags = 0;
//printf("Node %u: (%.2f -> %.2f, %.2f -> %.2f)\n", hindex-1, head->minx, head->maxx, head->miny, head->maxy);
if(final) {
head->flags |= nodeFinal;
head->faces.count = faces.size();
head->faces.offset = findex;
//printf(" Final node with %u faces, list offset %lu.\n", head->faces.count, head->faces.offset);
unsigned long r;
for(r = 0; r < head->faces.count; r++) {
flist[findex] = faces[r].index;
-1
View File
@@ -98,7 +98,6 @@ string GetToken(uchar *&Buffer, int &Position)
++Position;
}
++Position;
//printf("Returning %s\n", Token.c_str());
return Token;
}
-2
View File
@@ -34,7 +34,6 @@ FRAG_CONSTRUCTOR(Data03) {
memcpy(tex->filenames[i], buf, fnlen);
decode((uchar *) tex->filenames[i], fnlen);
//printf("fnlen is %d, %s\n", fnlen, tex->filenames[i]);
// Derision: Not sure why this check is here, but need to check fnlen is >=18
if(fnlen>=18) {
if(tex->filenames[i][fnlen - 8] == '.')
@@ -188,7 +187,6 @@ FRAG_CONSTRUCTOR(Data22) {
long Frag36Ref;
if(data->flags==0x181) {
Frag36Ref = *((long *) (data6area+20));
//printf("Frag 36 reference?: %ld\n", *((long *) (data6area+20)));
}
-1
View File
@@ -107,7 +107,6 @@ int Zonv4Loader::Open(char *base_path, char *zone_name, Archive *archive)
for(unsigned int i = 0; i < this->datloader.model_data.ModelNames.size(); ++i)
{
char tmp[200];
//printf("Opening %s.mod\n", this->datloader.model_data.ModelNames[i].c_str());
sprintf(tmp, "%s.mod", this->datloader.model_data.ModelNames[i].c_str());
char *str = tmp;
-2
View File
@@ -119,8 +119,6 @@ int main() {
snprintf(bptr, 128, "' WHERE id=%lu", id);
// printf("Query: '%s'\n", outbuffer);
//printf(outbuffer);
//printf(";\n");
/* if(mysql_query(&out, outbuffer) != 0) {
failed_count++;
printf(" Error updating char id %lu: %s\n", id, mysql_error(&m));
@@ -113,8 +113,6 @@ fprintf(stderr, "Char '%s' skill %d = %d\n", row[1], r, in_pp->skills[r]);
snprintf(bptr, 128, "' WHERE id=%lu", id);
// printf("Query: '%s'\n", outbuffer);
//printf(outbuffer);
//printf(";\n");
/* if(mysql_query(&out, outbuffer) != 0) {
failed_count++;
printf(" Error updating char id %lu: %s\n", id, mysql_error(&m));
-539
View File
@@ -1,539 +0,0 @@
#ShowEQ Import Notes:
# ZERO THE FILE first
# sed 's/0x[0-9a-fA-F]{4}/0x0000/g'
#Unknown Mapping:
#OP_Action2 -> OP_Damage
#OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
#Name Differences:
#OP_CancelInvite -> OP_GroupCancelInvite
#OP_GMFind -> OP_FindPersonRequest
OP_Unknown=0x0000
OP_ExploreUnknown=0x0292 #used for unknown explorer
#world packets
OP_ApproveWorld=0x41b1 # ShowEQ 06/29/05
OP_LogServer=0x4668 # EQEmu 06/29/05
OP_MOTD=0x7fea # EQEmu 06/29/05
OP_SendLoginInfo=0x2792 # EQEmu 06/29/05
OP_DeleteCharacter=0x0920 # ShowEQ 06/29/05
OP_SendCharInfo=0x732c # EQEmu 06/29/05
OP_ExpansionInfo=0x5c78 # EQEmu 06/29/05
OP_CharacterCreate=0x6160 # EQEmu 06/29/05
OP_RandomNameGenerator=0x23d4 # ShowEQ 06/29/05
OP_GuildsList=0x6957 # ShowEQ 06/29/05
OP_ApproveName=0x46b1 # EQEmu 06/29/05
OP_EnterWorld=0x7262 # EQEmu 06/29/05
OP_PostEnterWorld=0x0df0 # EQEmu 06/29/05
OP_World_Client_CRC1=0x254d # ShowEQ 06/29/05
OP_World_Client_CRC2=0x16c9 # ShowEQ 06/29/05
OP_SetChatServer=0x6238 # EQEmu 06/29/05
OP_SetChatServer2=0x6536 # EQEmu 06/29/05
OP_ZoneServerInfo=0x407c # EQEmu 06/29/05
OP_WorldComplete=0x509d # EQEmu 06/29/05
OP_WorldClientReady=0x5e99 # EQEmu 06/29/05 (Guess - Doodman)
OP_WorldUnknown001=0x7510 # EQEmu 06/29/05 (New to 6/29)
OP_SendSystemStats=0x681b # anonymous system stats reporting
OP_WorldLogout=0x7186
OP_ZoneUnavail=0x6d95
OP_WorldLevelTooHigh=0x583b # world->client. Cancels zone in.
OP_CharInacessable=0x28aa # world->client. Cancels zone in.
#OP_InvalidLoginPassword=0x52A4
#Zone in opcodes
OP_ZoneEntry=0x2ec9 # ShowEQ 06/29/05
OP_ZoneInUnknown=0x0000
OP_AckPacket=0x7752 # ShowEQ 06/29/05
OP_NewZone=0x7ac5 # ShowEQ 06/29/05
OP_ReqClientSpawn=0x0e76 # ShowEQ 06/29/05
OP_ZoneSpawns=0x5ee8 # ShowEQ 06/29/05
OP_CharInventory=0x15ff # EQEmu 06/29/05
OP_SetServerFilter=0x7709 # ShowEQ 06/29/05
OP_LockoutTimerInfo=0x7c12 # EQEmu 06/29/05
OP_SendZonepoints=0x775d # EQEmu 06/29/05
OP_SpawnDoor=0x4c24 # ShowEQ 06/29/05
OP_ReqNewZone=0x47c9 # ShowEQ 06/29/05
OP_PlayerProfile=0x75df # ShowEQ 06/29/05
OP_TimeOfDay=0x1580 # ShowEQ 06/29/05
OP_SendAATable=0x367d # ShowEQ 06/29/05
OP_ZoneServerReady=0x0000 #dosent exist in this version
OP_Logout=0x0701 # EQEmu 06/29/05
OP_LogoutReply=0x48c2 # ShowEQ 06/29/05 (OP_Logout)
OP_PreLogoutReply=0x711e #0 len packet sent during logout/zoning
OP_LevelUpdate=0x6d44 # ShowEQ 06/29/05
OP_MobUpdate=0x0000
OP_Stamina=0x74ab # ShowEQ 06/29/05
#Petition Opcodes
OP_PetitionSearch=0x2aec #search term for petition
OP_PetitionSearchResults=0x2aec #(list of?) matches from search
OP_PetitionSearchText=0x0000 #text results of search
OP_Petition=0x251f #0x73cb
OP_PetitionUpdate=0x3813 #guess
OP_PetitionCheckout=0x0000
OP_PetitionCheckIn=0x0000
OP_PetitionQue=0x0000
OP_PetitionUnCheckout=0x0000
OP_PetitionDelete=0x0000
OP_DeletePetition=0x0000
OP_PetitionResolve=0x6ea9 #0x688f # ShowEQ 5/11/05
OP_PDeletePetition=0x0000
OP_PetitionBug=0x0000
OP_PetitionRefresh=0x0000
OP_PetitionCheckout2=0x0000
OP_PetitionViewPetition=0x0000
#Guild Opcodes
OP_ZoneGuildList=0x68AC
OP_GuildMemberList=0x147d # ShowEQ 06/29/05
OP_GuildMemberUpdate=0x4cc7 # ShowEQ 06/29/05
OP_GuildMemberLevelUpdate=0x0000 #dosent exist in this version.
OP_GuildRemove=0x6cce # EQEmu - Doodman (found 8/26/05
OP_GuildPeace=0x0e37 # EQEmu - Doodman (found 8/26/05
OP_GuildWar=0x186d # EQEmu - Doodman (found 8/26/05
OP_GuildLeader=0x1ef1 # EQEmu - Doodman (found 8/26/05)
OP_GuildDemote=0x1f46 # EQEmu - Doodman (found 8/26/05)
OP_GuildMOTD=0x21ed # ShowEQ 06/29/05
OP_SetGuildMOTD=0x475a # EQEmu - Doodman (found 8/26/05)
OP_GetGuildsList=0x7fec # ShowEQ 06/29/05
OP_GuildInvite=0x61d0 # EQEmu - Doodman (found 8/26/05)
OP_GuildPublicNote=0x17a2 # EQEmu - Doodman (found 8/26/05)
OP_GuildDelete=0x5a4d # EQEmu - Doodman (found 8/26/05
OP_GuildInviteAccept=0x0179 # EQEmu - Doodman (found 8/26/05)
OP_GetGuildMOTD=0x3246
OP_GetGuildMOTDReply=0x5B14
OP_GuildManageBanker=0x3d1e
OP_GuildBank=0x0000
#guild opcodes: 549F (clear guild?), 0x0695, 0x0AC0, 0x1864, 0x32cf, 0x4cc7,
# 0x461A, 0x6966, 0x7085
#GM/guide opcodes
OP_GMServers=0x3387 #/servers
OP_GMBecomeNPC=0x7864 #/becomenpc
OP_GMZoneRequest=0x61ff #/zone
OP_GMSearchCorpse=0x7f3e #/searchcorpse
OP_GMHideMe=0x0581 #/hideme
OP_GMGoto=0x69c8 #/goto
OP_GMDelCorpse=0x727a #/delcorpse
OP_GMApproval=0x0000
OP_GMToggle=0x5ce2 #/toggle
OP_GMZoneRequest2=0x0000
OP_GMSummon=0x3383 #/summon
OP_GMEmoteZone=0x3905 #/emotezone
OP_GMFind=0x5e6a #/find
OP_GMKick=0x1cee #/kick
OP_GMNameChange=0x0000
OP_SafePoint=0x0000
OP_Bind_Wound=0x4796
OP_GMTraining=0x613d
OP_GMEndTraining=0x181c
OP_GMTrainSkill=0x3838
OP_GMEndTrainingResponse=0x0a94
OP_Animation=0x0b71 # EQEmu 06/29/05
OP_Taunt=0x5306
OP_Stun=0x7DCF
OP_MoneyUpdate=0x425c
OP_SendAAStats=0x5966 # EQEmu 06/29/05
OP_SendExpZonein=0x0587 # ShowEQ 06/29/05
OP_RespondAA=0x35e8
OP_UpdateAA=0x0000
OP_IncreaseStats=0x0000
OP_ReadBook=0x1496
OP_CombatAbility=0x5e55
OP_Dye=0x773f # ShowEQ 06/29/05
OP_Consume=0x7a83 # ShowEQ 06/29/05
OP_Begging=0x2c81 # ShowEQ 06/29/05
OP_InspectRequest=0x2403
OP_Action2=0x0000 # ShowEQ 06/29/05
OP_BeginCast=0x3990 # ShowEQ 06/29/05
OP_WhoAllRequest=0x5cdd # ShowEQ 06/29/05
OP_ColoredText=0x4bc6 # ShowEQ 06/29/05
OP_Consent=0x1081 # ShowEQ 06/29/05
OP_LFGCommand=0x022f # ShowEQ 06/29/05
OP_LFGGetMatchesRequest=0x6f82 # ShowEQ 06/29/05
OP_LFGAppearance=0x024d
OP_LFGResponse=0x1fe1 # ShowEQ 5/11/05
OP_LFGGetMatchesResponse=0x06c5 # ShowEQ 06/29/05
OP_LootItem=0x2acf # ShowEQ 06/29/05
OP_Bug=0x3eba # ShowEQ 06/29/05
OP_BoardBoat=0x67c9 # ShowEQ 06/29/05
OP_Save=0x6d9b # ShowEQ 06/29/05
OP_Camp=0x2844 # ShowEQ 06/29/05
OP_EndLootRequest=0x7fe4 # ShowEQ 06/29/05
OP_LoadSpellSet=0x403e # ShowEQ 06/29/05
OP_AutoAttack=0x6c47 # ShowEQ 06/29/05
OP_AutoFire=0x6c53
OP_Consider=0x2717 # ShowEQ 06/29/05
OP_Emote=0x55bc # ShowEQ 06/29/05
OP_PetCommands=0x58b2 # ShowEQ 06/29/05
OP_PetBuffWindow=0x4e31
OP_SpawnAppearance=0x18b7 # ShowEQ 06/29/05
OP_DeleteSpawn=0x1a64 # ShowEQ 06/29/05
OP_FormattedMessage=0x42cd # ShowEQ 06/29/05
OP_WhoAllResponse=0x6686 # ShowEQ 06/29/05
OP_AutoAttack2=0x0fa6 # ShowEQ 06/29/05
OP_SetRunMode=0x0342 # ShowEQ 06/29/05
OP_SimpleMessage=0x5a48 # ShowEQ 06/29/05
OP_SaveOnZoneReq=0x2baf # ShowEQ 06/29/05
OP_MoveDoor=0x0ef7 # ShowEQ 06/29/05
OP_SenseHeading=0x5666 # ShowEQ 06/29/05
OP_Buff=0x33dc # ShowEQ 06/29/05
OP_LootComplete=0x20b2 # ShowEQ 06/29/05
OP_EnvDamage=0x0990
OP_Split=0x6a53 # ShowEQ 06/29/05
OP_Surname=0x48fe # ShowEQ 06/29/05
OP_ClearSurname=0x0000
OP_MoveItem=0x7657 # ShowEQ 06/29/05
OP_FaceChange=0x763b # ShowEQ 06/29/05
OP_ItemPacket=0x3397 # ShowEQ 06/29/05
OP_ItemLinkResponse=0x1d43 # ShowEQ 06/29/05
OP_ClientReady=0x5e20 # ShowEQ 06/29/05
OP_ZoneChange=0x60ef # ShowEQ 06/29/05
OP_MemorizeSpell=0x05ac # ShowEQ 06/29/05
OP_ItemLinkClick=0x53e5 # ShowEQ 06/29/05
OP_SwapSpell=0x36b2 # ShowEQ 06/29/05
OP_Forage=0x7c32 # ShowEQ 06/29/05
OP_ConsentResponse=0x6380 # ShowEQ 06/29/05
OP_BazaarSearch=0x524e # ShowEQ 06/29/05
OP_NewSpawn=0x4f11 # ShowEQ 06/29/05
OP_WearChange=0x601d # ShowEQ 06/29/05
OP_Action=0x4513 # ShowEQ 06/29/05
OP_SpecialMesg=0x5ef7 # ShowEQ 06/29/05
OP_Bazaar=0x0000
OP_LeaveBoat=0x7187 # ShowEQ 06/29/05
OP_Weather=0x65ca # ShowEQ 06/29/05
OP_LFPGetMatchesRequest=0x45d0 # ShowEQ 06/29/05
OP_Illusion=0x7441 # ShowEQ 06/29/05
OP_TargetMouse=0x2274 # ShowEQ 06/29/05
OP_InspectAnswer=0x2dd6 # ShowEQ 06/29/05
OP_GMKill=0x692c # ShowEQ 06/29/05
OP_MoneyOnCorpse=0x2fca # ShowEQ 06/29/05
OP_ClickDoor=0x700d # ShowEQ 06/29/05
OP_LootRequest=0x2316 # ShowEQ 06/29/05
OP_YellForHelp=0x2e20 # ShowEQ 06/29/05
OP_ManaChange=0x0b2d # ShowEQ 06/29/05
OP_ConsentDeny=0x4e8c # ShowEQ 06/29/05
OP_LFPCommand=0x35a6 # ShowEQ 06/29/05
OP_RandomReply=0x6cd5 # ShowEQ 06/29/05
OP_DenyResponse=0x7c66 # ShowEQ 06/29/05
OP_ConsiderCorpse=0x673c # ShowEQ 06/29/05
OP_CorpseDrag=0x50c0 #
OP_CorpseDrop=0x7c7c #
OP_ConfirmDelete=0x28f2 # ShowEQ 06/29/05
OP_MobHealth=0x3d2d # ShowEQ 06/29/05
OP_SkillUpdate=0x6a93 # ShowEQ 06/29/05
OP_RandomReq=0x21e0 # ShowEQ 06/29/05
OP_CastSpell=0x4839 # ShowEQ 06/29/05
OP_ClientUpdate=0x14cb # ShowEQ 06/29/05
OP_MobUpdate=0x0000 #not used anymore, here for backwards compat
OP_Report=0x0375 # ShowEQ 06/29/05
OP_GroundSpawn=0x736b # ShowEQ 06/29/05
OP_TargetCommand=0x6563 #0x0dfe # ShowEQ 06/29/05
OP_TargetHoTT=0x3ef6
OP_LFPGetMatchesResponse=0x63fe # ShowEQ 06/29/05
OP_Jump=0x4dbc # ShowEQ 06/29/05
OP_ExpUpdate=0x5ecd # ShowEQ 06/29/05
OP_AAAction=0x3af4 # ShowEQ 06/29/05
OP_Death=0x5188 # ShowEQ 06/29/05
OP_BecomeCorpse=0x128c
OP_GMLastName=0x0c81 # ShowEQ 06/29/05
OP_InitialMobHealth=0x2ecc # ShowEQ 06/29/05
OP_Mend=0x14ef # ShowEQ 06/29/05
OP_MendHPUpdate=0x1ffa # ShowEQ 5/11/05
OP_Feedback=0x224d # ShowEQ 06/29/05
OP_TGB=0x5e51 # ShowEQ 06/29/05
OP_InterruptCast=0x0db3
OP_Damage=0x1848 # ShowEQ 06/29/05 (OP_Action2)
OP_ChannelMessage=0x1004 # ShowEQ 06/29/05 (OP_CommonMessage)
OP_LevelAppearance=0x358e
OP_MultiLineMsg=0x0000
OP_Charm=0x10a1
OP_DeleteSpell=0x3fe6
OP_ApproveZone=0x0000
OP_Assist=0x5D02
OP_AugmentItem=0x539b
OP_BazaarInspect=0x0000
OP_AAExpUpdate=0x6dd8 # ShowEQ 06/29/05
OP_ClientError=0x0000
OP_DeleteItem=0x1c4a
OP_DeleteCharge=0x0841
OP_ControlBoat=0x0000
OP_DumpName=0x0000
OP_FeignDeath=0x2ad8
OP_Fishing=0x0b36
OP_Heartbeat=0x0000
OP_InstillDoubt=0x389e
OP_ItemName=0x0000
OP_LDoNButton=0x0000
OP_LDoNOpen=0x083b
OP_MoveCoin=0x1dd9
OP_ReloadUI=0x0000
OP_ZonePlayerToBind=0x385e # FNW Discovered on Feb 9, 2007
OP_Translocate=0x78c1
OP_Sacrifice=0x5f62
OP_ApplyPoison=0x4298
#bazaar trader stuff stuff:
#become and buy from
#Server->Client: [ Opcode: OP_Unknown (0x2403) Size: 8 ]
# 0: 46 01 00 00 39 01 00 00 | F...9...
OP_TraderDelItem=0x0da9
OP_BecomeTrader=0x66f9
OP_TraderShop=0x19d8
OP_TraderItemUpdate=0x0000
OP_Trader=0x0681
OP_ShopItem=0x0000
OP_TraderBuy=0x0f8e # ShowEQ 06/29/05
OP_Barter=0x7460
#pc/npc trading
OP_TradeRequest=0x372f # ShowEQ 06/29/05
OP_TradeAcceptClick=0x0065 # ShowEQ 06/29/05
OP_TradeRequestAck=0x4048 # ShowEQ 06/29/05
OP_TradeCoins=0x34c1
OP_FinishTrade=0x6014
OP_CancelTrade=0x2dc1 # ShowEQ 06/29/05
OP_TradeMoneyUpdate=0x3e63 #not sure
#merchant crap
OP_ShopPlayerSell=0x0e13 # ShowEQ 06/29/05
OP_ShopEnd=0x7e03 # ShowEQ 06/29/05
OP_ShopEndConfirm=0x0000
OP_ShopPlayerBuy=0x221e
OP_ShopRequest=0x3c4b # ShowEQ 06/29/05
OP_ShopDelItem=0x0000 #0x0da9 maybe, 16 bytes though
#tradeskill stuff:
OP_ClickObject=0x0f47 # ShowEQ 06/29/05
OP_ClickObjectAction=0x6937 # EQEMu 06/29/05
OP_RecipeDetails=0x0353 # EQEMu 06/29/05
OP_RecipesFavorite=0x23f0
OP_RecipesSearch=0x31f8 # EQEmu 06/29/05
OP_RecipeReply=0x4ea2 # EQEmu 06/29/05
OP_RecipeAutoCombine=0x7822
OP_TradeSkillCombine=0x0b40 # ShowEQ 06/29/05
OP_RequestDuel=0x28e1
OP_DuelResponse=0x2e78
OP_DuelResponse2=0x3bad #when accepted
OP_RezzComplete=0x60fa
OP_RezzRequest=0x417a
OP_RezzAnswer=0x6219
OP_SafeFallSuccess=0x5309
OP_Shielding=0x0000
OP_TargetReject=0x0000
OP_TestBuff=0x0000
OP_Track=0x5205 # ShowEQ 06/29/05
OP_TrackTarget=0x71ae
OP_TrackUnknown=0x74e1 #size 0 right after OP_Track
#Tribute Packets:
OP_OpenGuildTributeMaster=0x60b6 #open guild tribute master window
OP_OpenTributeMaster=0x512e #open tribute master window
OP_OpenTributeReply=0x0000 #reply to open request
OP_SelectTribute=0x625d #clicking on a tribute, and text reply
OP_TributeItem=0x6f6c #donating an item
OP_TributeMoney=0x27b3 #donating money
OP_TributeNPC=0x0000 #seems to be missing now
OP_TributeToggle=0x2688 #activating/deactivating tribute
OP_TributeTimer=0x4665 #a 4 byte tier update, 10 minutes for seconds
OP_TributePointUpdate=0x6463 #16 byte point packet
OP_TributeUpdate=0x5639 # ShowEQ 06/29/05
OP_GuildTributeInfo=0x5e3d # EQEmu 06/29/05
OP_TributeInfo=0x152d # EQEmu 06/29/05
OP_SendGuildTributes=0x5e3a # request packet, 4 bytes
OP_SendTributes=0x067a # request packet, 4 bytes, migth be backwards
OP_CloseTributeMaster=0x7f25 #sent by client when they close window
#Adventure packets:
OP_LeaveAdventure=0x0c0d
OP_AdventureFinish=0x3906
OP_AdventureInfoRequest=0x2aaf #right click adventure recruiter
OP_AdventureInfo=0x1db5 #text reply to right click
OP_AdventureRequest=0x43fd
OP_AdventureDetails=0x3f26
OP_AdventureData=0x0677
OP_AdventureUpdate=0x64ac
OP_AdventureMerchantRequest=0x0950
OP_AdventureMerchantResponse=0x4416
OP_AdventureMerchantPurchase=0x413d
OP_AdventureMerchantSell=0x0097
OP_AdventurePointsUpdate=0x420a #not sure, followed purchase
OP_AdventureStatsRequest=0x5fc7
OP_AdventureStatsReply=0x56cd
OP_AdventureLeaderboardRequest=0x230a
OP_AdventureLeaderboardReply=0x0d0f
# request stats: 0x5fc7, reply 0x56cd
# request leaderboard: 0x230a, reply 0x0d0f
#Group Opcodes
OP_GroupDisband=0x4033 # ShowEQ 06/29/05
OP_GroupInvite=0x3853 # ShowEQ 06/29/05
OP_GroupFollow=0x1b48 # ShowEQ 06/29/05
OP_GroupUpdate=0x66ba # ShowEQ 06/29/05
OP_GroupAcknowledge=0x0797
OP_GroupCancelInvite=0x42c9 # ShowEQ 06/29/05
OP_GroupDelete=0x0000
OP_GroupFollow2=0x0000 #used with GroupInvite2
OP_GroupInvite2=0x1f27 #this is sometimes sent instead of OP_GroupInvite
OP_CancelInvite=0x0000
OP_RaidJoin=0x0000 # ShowEQ 06/29/05
OP_RaidInvite=0x1f21 # ShowEQ 06/29/05
OP_RaidUpdate=0x1974 # EQEmu 06/29/05
OP_ZoneComplete=0x0000
OP_ItemLinkText=0x0000
OP_ClearObject=0x8258
OP_DisciplineUpdate=0x7180
OP_DisciplineTimer=0x53df
OP_LocInfo=0x0000
OP_FindPersonRequest=0x3c41 # ShowEQ 06/29/05
OP_FindPersonReply=0x5711
OP_ForceFindPerson=0x0000
OP_LoginComplete=0x0000
OP_Sound=0x4a1d
#OP_Zone_MissingName01=0x0000 #remove on recompile
OP_MobRename=0x3230
OP_BankerChange=0x6a5b
#Rogue packets
OP_SenseTraps=0x24ab # ShowEQ 06/29/05
OP_PickPocket=0x4a2a
OP_DisarmTraps=0x0000
OP_Disarm=0x17d9
OP_Hide=0x6f64 # ShowEQ 06/29/05
OP_Sneak=0x4312 # ShowEQ 06/29/05
#Task packets
#task complete related: 0x54eb (24 bytes), 0x4c8c (8 bytes), 0x6a1d (4 bytes)
OP_TaskActivityComplete=0x54eb
OP_CompletedTasks=0x53c4 # ShowEQ 06/29/05
OP_TaskDescription=0x682d # ShowEQ 06/29/05
OP_TaskActivity=0x3ba8 # ShowEQ 06/29/05
OP_TaskMemberList=0x09b6 #not sure
OP_OpenNewTasksWindow=0x5e7c #combined with OP_AvaliableTask I think
OP_AvaliableTask=0x0000
OP_AcceptNewTask=0x207f
OP_TaskHistoryRequest=0x3274
OP_TaskHistoryReply=0x009c
OP_CancelTask=0x4c8c
OP_DeclineAllTasks=0x207f #not sure, 12 bytes
OP_RequestClientZoneChange=0x1235
OP_PurchaseLeadershipAA=0x07f1
OP_UpdateLeadershipAA=0x3eec
OP_LeadershipExpUpdate=0x7416
OP_LeadershipExpToggle=0x17bf
OP_GroupUpdateLeaderAA=0x4c3f
OP_MarkNPC=0x5b37
OP_ClearNPCMarks=0x1794
OP_DoGroupLeadershipAbility=0x4ffe
OP_DelegateAbility=0x56eb
#The following 4 Opcodes are for SoF only:
OP_FinishWindow=0x0000 #Trevius 03/15/09
OP_FinishWindow2=0x0000 #Trevius 03/15/09
OP_ItemVerifyRequest=0x0000 #Trevius 03/15/09
OP_ItemVerifyReply=0x0000 #Trevius 03/15/09
#discovered opcodes not yet used:
OP_CrashDump=0x6d5d
OP_PlayMP3=0x0000
OP_FriendsWho=0x41db
OP_MoveLogRequest=0x78e8 #gone I think
OP_MoveLogDisregard=0x0000 #gone I think
OP_ReclaimCrystals=0x12fd
OP_CrystalCountUpdate=0x0000
OP_DynamicWall=0x0000
OP_CustomTitles=0x2a28 # ShowEQ 06/29/05
OP_RequestTitles=0x5eba # EQEmu 06/29/05
OP_SendTitleList=0x3e89 # EQEmu 06/29/05
OP_SetTitle=0x1f22 # EQEmu 06/29/05
OP_SetTitleReply=0x5eab # EQEmu 06/29/05
OP_Bandolier=0x6f0c
OP_PotionBelt=0x0719
OP_OpenDiscordMerchant=0x0000 #8 bytes
OP_DiscordMerchantInventory=0x0000 #long item packet
OP_GiveMoney=0x56d4 #16 bytes, pp, gp, sp, cp.
OP_OnLevelMessage=0x1dde
OP_PopupResponse=0x3816
OP_RequestKnowledgeBase=0x7584
OP_KnowledgeBase=0x4a52
OP_PlayerUnderWorld=0x46d9
OP_PVPStats=0x5cc0
OP_PVPLeaderBoardRequest=0x61d2
OP_PVPLeaderBoardReply=0x1a59
OP_PVPLeaderBoardDetailsRequest=0x06a2
OP_PVPLeaderBoardDetailsReply=0x246a
OP_WeaponEquip1=0x6c5e
OP_WeaponEquip2=0x63da
OP_WeaponUnequip2=0x381d
OP_VoiceMacroIn=0x2866
OP_VoiceMacroOut=0x2ec6
#named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000 # EQEmu 06/29/05
OP_Some6ByteHPUpdate=0x0000 #seems to happen when you target group members
OP_SomeItemPacketMaybe=0x497c # EQEmu 06/29/05
OP_QueryResponseThing=0x6379
OP_FloatListThing=0x7510 # EQEmu 06/29/05
#Login opcodes
OP_SessionReady=0x0001
OP_Login=0x0002
OP_ServerListRequest=0x0004
OP_PlayEverquestRequest=0x000d
OP_PlayEverquestResponse=0x0021
OP_ChatMessage=0x0016
OP_LoginAccepted=0x0017
OP_ServerListResponse=0x0018
OP_Poll=0x0029
OP_EnterChat=0x000f
OP_PollResponse=0x0011
#raw opcodes
OP_RAWSessionRequest=0x0000
OP_RAWSessionResponse=0x0000
OP_RAWCombined=0x0000
OP_RAWSessionDisconnect=0x0000
OP_RAWKeepAlive=0x0000
OP_RAWSessionStatRequest=0x0000
OP_RAWSessionStatResponse=0x0000
OP_RAWPacket=0x0000
OP_RAWFragment=0x0000
OP_RAWOutOfOrderAck=0x0000
OP_RAWAck=0x0000
OP_RAWAppCombined=0x0000
OP_RAWOutOfSession=0x0000
#mail opcodes
OP_Command=0x0000
OP_MailboxHeader=0x0000
OP_MailHeader=0x0000
OP_MailBody=0x0000
OP_NewMail=0x0000
OP_SentConfirm=0x0000
#we need to document the differences between these packets to make identifying them easier
OP_MobHealth=0x3d2d # ShowEQ 06/29/05
OP_HPUpdate=0x217b # ShowEQ 06/29/05
OP_Some3ByteHPUpdate=0x0000 #initial HP update for mobs
OP_InitialHPUpdate=0x7ac2 # ShowEQ 06/29/05
#remove these
#junk
OP_0x0193=0x0000
OP_0x0347=0x0000
OP_ConsumeAmmo=0x0000
OP_EmoteAnim=0x0000
OP_Deny=0x0000
OP_SetDataRate=0x0000
+10 -4
View File
@@ -94,6 +94,8 @@ OP_ClearBlockedBuffs=0x5d3c
OP_WorldObjectsSent=0x7fa8
OP_SendExpZonein=0x25ab
OP_SendAATable=0x7791
OP_ClearAA=0x422e
OP_ClearLeadershipAbilities=0xb978
OP_RespondAA=0x379d
OP_UpdateAA=0x504f
OP_SendAAStats=0x3d1c
@@ -289,8 +291,10 @@ OP_LeadershipExpToggle=0x3ea6
OP_LeadershipExpUpdate=0x6922
OP_PurchaseLeadershipAA=0x1962
OP_UpdateLeadershipAA=0x56aa
OP_MarkNPC=0x2d9f
OP_MarkNPC=0x1a6c
OP_MarkRaidNPC=0x2d9f #unimplemented
OP_ClearNPCMarks=0x0d2d
OP_ClearRaidNPCMarks=0x433a #unimplemented
OP_DelegateAbility=0x7820
OP_SetGroupTarget=0x118a
OP_Charm=0x7118
@@ -365,7 +369,7 @@ OP_DzLeaderStatus=0x4021
OP_DzExpeditionEndsWarning=0x32eb
OP_DzMemberList=0x348f
OP_DzCompass=0x0e01 # Was 0x4f09
OP_DzChooseZone=0x0000 # Maybe 0x29d6
OP_DzChooseZone=0x6e5e # Maybe 0x29d6
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
@@ -498,6 +502,8 @@ OP_GroupRoles=0x047c
OP_GroupMakeLeader=0x4129
OP_DoGroupLeadershipAbility=0x17d7
OP_GroupLeadershipAAUpdate=0x6567
OP_GroupMentor=0x56DB
OP_InspectBuffs=0x01f3
# LFG/LFP Opcodes
OP_LFGCommand=0x4463
@@ -510,8 +516,8 @@ OP_LFGAppearance=0x0000
OP_LFGResponse=0x0000
# Raid Opcodes
OP_RaidInvite=0x1bd1
OP_RaidUpdate=0x548e
OP_RaidInvite=0x5fb2
OP_RaidUpdate=0x1bd1
OP_RaidJoin=0x0000
# Button-push commands
+661
View File
@@ -0,0 +1,661 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x7a09
OP_ApproveWorld=0x7499
OP_LogServer=0x7ceb
OP_SendCharInfo=0x00d2
OP_ExpansionInfo=0x590d
OP_GuildsList=0x507a
OP_EnterWorld=0x578f
OP_PostEnterWorld=0x6259
OP_World_Client_CRC1=0x12cc
OP_World_Client_CRC2=0x0f13
OP_SendSpellChecksum=0x0000
OP_SendSkillCapsChecksum=0x0000
# Character Select Related:
OP_SendMaxCharacters=0x5475
OP_SendMembership=0x7acc
OP_SendMembershipDetails=0x057b
OP_CharacterCreateRequest=0x6773
OP_CharacterCreate=0x6bbf
OP_DeleteCharacter=0x1808
OP_RandomNameGenerator=0x5954
OP_ApproveName=0x56a2
OP_MOTD=0x0c22
OP_SetChatServer=0x1bc5
OP_SetChatServer2=0x7eec
OP_ZoneServerInfo=0x4c44
OP_WorldComplete=0x4493
OP_WorldUnknown001=0x2301
OP_FloatListThing=0x46c6
# Reasons for Disconnect:
OP_ZoneUnavail=0x4cb4
OP_WorldClientReady=0x23c1
OP_CharacterStillInZone=0x0000
OP_WorldChecksumFailure=0x0000
OP_WorldLoginFailed=0x0000
OP_WorldLogout=0x0000
OP_WorldLevelTooHigh=0x0000
OP_CharInacessable=0x0000
OP_UserCompInfo=0x0000
OP_SendExeChecksum=0x0000
OP_SendBaseDataChecksum=0x0000
# Zone in opcodes
OP_AckPacket=0x471d
OP_ZoneEntry=0x5089
OP_ReqNewZone=0x7887
OP_NewZone=0x1795
OP_ZoneSpawns=0x5237
OP_PlayerProfile=0x6506
OP_TimeOfDay=0x5070
OP_LevelUpdate=0x1eec
OP_Stamina=0x2a79
OP_RequestClientZoneChange=0x3fcf
OP_ZoneChange=0x2d18
OP_LockoutTimerInfo=0x0000
OP_ZoneServerReady=0x0000
OP_ZoneInUnknown=0x0000
OP_LogoutReply=0x0000
OP_PreLogoutReply=0x0000
# Required to fully log in
OP_SpawnAppearance=0x0971
OP_ChangeSize=0x4707
OP_TributeUpdate=0x5961
OP_TributeTimer=0x073d
OP_SendTributes=0x729b
OP_SendGuildTributes=0x1877
OP_TributeInfo=0x4254
OP_Weather=0x661e
OP_ReqClientSpawn=0x35fa
OP_SpawnDoor=0x7291
OP_GroundSpawn=0x6fca
OP_SendZonepoints=0x69a4
OP_BlockedBuffs=0x3033
OP_RemoveBlockedBuffs=0x0de7
OP_ClearBlockedBuffs=0x34cb
OP_WorldObjectsSent=0x5ae2
OP_SendExpZonein=0x5f8e
OP_SendAATable=0x66b5
OP_ClearAA=0x0f50
OP_ClearLeadershipAbilities=0x6da5
OP_RespondAA=0x7a27
OP_UpdateAA=0x66f0
OP_SendAAStats=0x43c8
OP_AAExpUpdate=0x7d14
OP_ExpUpdate=0x20ed
OP_HPUpdate=0x2828
OP_ManaChange=0x5467
OP_TGB=0x0876
OP_SpecialMesg=0x0083
OP_GuildMemberList=0x12a6
OP_GuildMOTD=0x3e13
OP_CharInventory=0x5ca6
OP_WearChange=0x7994
OP_ClientUpdate=0x7dfc
OP_ClientReady=0x345d
OP_SetServerFilter=0x444d
# Guild Opcodes
OP_GetGuildMOTD=0x36e0
OP_GetGuildMOTDReply=0x4f1f
OP_GuildMemberUpdate=0x69b9
OP_GuildInvite=0x7099
OP_GuildRemove=0x1444
OP_GuildPeace=0x67e3
OP_SetGuildMOTD=0x0b0b
OP_GuildWar=0x1ffb
OP_GuildLeader=0x7e09
OP_GuildDelete=0x3708
OP_GuildInviteAccept=0x7053
OP_GuildDemote=0x2d4e
OP_GuildPromote=0x6a98
OP_GuildPublicNote=0x5053
OP_GuildManageBanker=0x748f
OP_GuildBank=0x5134
OP_SetGuildRank=0x0b9c
OP_GuildUpdateURLAndChannel=0x2958
OP_GuildStatus=0x7326
OP_GuildCreate=0x76d9
OP_GuildMemberLevelUpdate=0x0000 # Unused?
OP_ZoneGuildList=0x0000 # Unused?
OP_GetGuildsList=0x0000 # Unused?
OP_LFGuild=0x0000
OP_GuildManageRemove=0x0000
OP_GuildManageAdd=0x0000
OP_GuildManageStatus=0x0000
# GM/Guide Opcodes
OP_GMServers=0x08c1
OP_GMBecomeNPC=0x3ae1
OP_GMZoneRequest=0x62ac
OP_GMZoneRequest2=0x7e1a
OP_GMGoto=0x7d8e
OP_GMSearchCorpse=0x357c
OP_GMHideMe=0x79c5
OP_GMDelCorpse=0x607e
OP_GMApproval=0x6db5
OP_GMToggle=0x2097
OP_GMSummon=0x486f
OP_GMEmoteZone=0x1cfd
OP_GMEmoteWorld=0x458e
OP_GMFind=0x4a8f
OP_GMKick=0x26a7
OP_GMKill=0x51d3
OP_GMNameChange=0x035f
OP_GMLastName=0x46ce
# Misc Opcodes
OP_InspectRequest=0x57bc
OP_InspectAnswer=0x71ac
OP_InspectMessageUpdate=0x4d25
OP_BeginCast=0x318f
OP_ColoredText=0x43af
OP_ConsentResponse=0x384a
OP_MemorizeSpell=0x217c
OP_SwapSpell=0x0efa
OP_CastSpell=0x1287
OP_Consider=0x742b
OP_FormattedMessage=0x1024
OP_SimpleMessage=0x213f
OP_Buff=0x659c
OP_Illusion=0x312a
OP_MoneyOnCorpse=0x5f44
OP_RandomReply=0x106b
OP_DenyResponse=0x2382
OP_SkillUpdate=0x04c
OP_GMTrainSkillConfirm=0x4b64
OP_RandomReq=0x7b10
OP_Death=0x6517
OP_GMTraining=0x1966
OP_GMEndTraining=0x4d6b
OP_GMTrainSkill=0x2a85
OP_Animation=0x7177
OP_Begging=0x6703
OP_Consent=0x1fd1
OP_ConsentDeny=0x7a45
OP_AutoFire=0x241e
OP_PetCommands=0x0159
OP_DeleteSpell=0x3358
OP_Surname=0x0423
OP_ClearSurname=0x3fb0
OP_FaceChange=0x5578
OP_SenseHeading=0x260a
OP_Action=0x744c
OP_ConsiderCorpse=0x5204
OP_HideCorpse=0x49e1
OP_CorpseDrag=0x0904
OP_CorpseDrop=0x7037
OP_Bug=0x73f4
OP_Feedback=0x5602
OP_Report=0x6f14
OP_Damage=0x6f15
OP_ChannelMessage=0x2b2d
OP_Assist=0x4478
OP_AssistGroup=0x27f8
OP_MoveCoin=0x0bcf
OP_ZonePlayerToBind=0x08d8
OP_KeyRing=0x1219
OP_WhoAllRequest=0x674b
OP_WhoAllResponse=0x578c
OP_FriendsWho=0x3956
OP_ConfirmDelete=0x43a3
OP_Logout=0x4ac6
OP_Rewind=0x1745
OP_TargetCommand=0x58e2
OP_Hide=0x67fe
OP_Jump=0x31f4
OP_Camp=0x28ec
OP_Emote=0x373b
OP_SetRunMode=0x009f
OP_BankerChange=0x791e
OP_TargetMouse=0x075d
OP_MobHealth=0x37b1
OP_InitialMobHealth=0x0000 # Unused?
OP_TargetHoTT=0x0272
OP_TargetBuffs=0x4f4b
OP_XTargetResponse=0x4d59
OP_XTargetRequest=0x3763
OP_XTargetAutoAddHaters=0x672f
OP_BuffCreate=0x3377
OP_BuffRemoveRequest=0x64f2
OP_DeleteSpawn=0x7280
OP_AutoAttack=0x109d
OP_AutoAttack2=0x3526
OP_Consume=0x4b70
OP_MoveItem=0x32ee
OP_DeleteItem=0x18ad
OP_DeleteCharge=0x01b8
OP_ItemPacket=0x368e
OP_ItemLinkResponse=0x70c0
OP_ItemLinkClick=0x4cef
OP_ItemPreview=0x6b5c
OP_NewSpawn=0x6097
OP_Track=0x17e5
OP_TrackTarget=0x695e
OP_TrackUnknown=0x4577
OP_ClickDoor=0x3a8f
OP_MoveDoor=0x08e8
OP_RemoveAllDoors=0x700c
OP_EnvDamage=0x51fd
OP_BoardBoat=0x4211
OP_LeaveBoat=0x7617
OP_ControlBoat=0x0ae7
OP_Forage=0x5306
OP_SafeFallSuccess=0x2219
OP_RezzComplete=0x760d
OP_RezzRequest=0x3c21
OP_RezzAnswer=0x701c
OP_Shielding=0x52e5
OP_RequestDuel=0x3af1
OP_MobRename=0x2c57
OP_AugmentItem=0x661b
OP_WeaponEquip1=0x34a7
OP_WeaponEquip2=0x559a
OP_WeaponUnequip2=0x2d25
OP_ApplyPoison=0x31e6
OP_Save=0x4a39
OP_TestBuff=0x7cb8
OP_CustomTitles=0x100e
OP_Split=0x3a54
OP_YellForHelp=0x4e56
OP_LoadSpellSet=0x261d
OP_Bandolier=0x7677
OP_PotionBelt=0x1a3e
OP_DuelResponse=0x6a46
OP_DuelResponse2=0x68d3
OP_SaveOnZoneReq=0x600d
OP_ReadBook=0x72df
OP_Dye=0x23b9
OP_InterruptCast=0x048c
OP_AAAction=0x424e
OP_LeadershipExpToggle=0x74bd
OP_LeadershipExpUpdate=0x2797
OP_PurchaseLeadershipAA=0x6c55
OP_UpdateLeadershipAA=0x0026
OP_MarkNPC=0x1fb5
OP_MarkRaidNPC=0x5a58 #unimplemented
OP_ClearNPCMarks=0x2003
OP_ClearRaidNPCMarks=0x20d3 #unimplemented
OP_DelegateAbility=0x4c9d
OP_SetGroupTarget=0x026
OP_Charm=0x5d92
OP_Stun=0x36a4
OP_SendFindableNPCs=0x4613
OP_FindPersonRequest=0x5cea
OP_FindPersonReply=0x7e58
OP_Sound=0x1a30
OP_PetBuffWindow=0x5882
OP_LevelAppearance=0x3bc9
OP_Translocate=0x6580
OP_Sacrifice=0x1821
OP_PopupResponse=0x08a6
OP_OnLevelMessage=0x575b
OP_AugmentInfo=0x0afb
OP_Petition=0x3de3
OP_SomeItemPacketMaybe=0x747c
OP_PVPStats=0x4b15
OP_PVPLeaderBoardRequest=0x04aa
OP_PVPLeaderBoardReply=0x071f
OP_PVPLeaderBoardDetailsRequest=0x3707
OP_PVPLeaderBoardDetailsReply=0x25b7
OP_RestState=0x000f
OP_RespawnWindow=0x0ecb
OP_LDoNButton=0x5327
OP_SetStartCity=0x6326
OP_VoiceMacroIn=0x17fd
OP_VoiceMacroOut=0x409a
OP_ItemViewUnknown=0x465b
OP_VetRewardsAvaliable=0x590e
OP_VetClaimRequest=0x1126
OP_VetClaimReply=0x16d4
OP_DisciplineUpdate=0x759e
OP_DisciplineTimer=0x6989
OP_BecomeCorpse=0x0000 # Unused?
OP_Action2=0x0000 # Unused?
OP_MobUpdate=0x2c84
OP_NPCMoveUpdate=0x5892
OP_CameraEffect=0x127f
OP_SpellEffect=0x5936
OP_RemoveNimbusEffect=0x7b1e
OP_AltCurrency=0x6b6d
OP_AltCurrencyMerchantRequest=0x5409
OP_AltCurrencyMerchantReply=0x27a2
OP_AltCurrencyPurchase=0x3788
OP_AltCurrencySell=0x40b6
OP_AltCurrencySellSelection=0x532a
OP_AltCurrencyReclaim=0x0339
OP_CrystalCountUpdate=0x467f
OP_CrystalCreate=0x7aee
OP_CrystalReclaim=0x2439
OP_Untargetable=0x053c
OP_IncreaseStats=0x70a3
OP_Weblink=0x6f4b
OP_OpenContainer=0x0000
OP_Marquee=0x502e
OP_ItemRecastDelay=0x15a9
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
OP_DzQuit=0x205f
OP_DzListTimers=0x0398
OP_DzAddPlayer=0x59ca
OP_DzRemovePlayer=0x4701
OP_DzSwapPlayer=0x1abc
OP_DzMakeLeader=0x405b
OP_DzPlayerList=0x543d
OP_DzJoinExpeditionConfirm=0x14c6
OP_DzJoinExpeditionReply=0x7f4b
OP_DzExpeditionInfo=0x4f7e
OP_DzExpeditionList=0x9119
OP_DzMemberStatus=0xb2e3
OP_DzLeaderStatus=0x32f0
OP_DzExpeditionEndsWarning=0x383c
OP_DzMemberList=0x3de9
OP_DzCompass=0x3e0e
OP_DzChooseZone=0x0b7d
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
OP_ManaUpdate=0x3791
OP_EnduranceUpdate=0x5f42
OP_MobManaUpdate=0x2404
OP_MobEnduranceUpdate=0x1c81
# Mercenary Opcodes
OP_MercenaryDataUpdateRequest=0x7b89
OP_MercenaryDataUpdate=0x61a4
OP_MercenaryDataRequest=0x11c1
OP_MercenaryDataResponse=0x72ce
OP_MercenaryHire=0x7169
OP_MercenaryDismiss=0x6e83
OP_MercenaryTimerRequest=0x31e4
OP_MercenaryTimer=0x0763
OP_MercenaryUnknown1=0x5d26
OP_MercenaryCommand=0x27f2
OP_MercenarySuspendRequest=0x4407
OP_MercenarySuspendResponse=0x6f03
OP_MercenaryUnsuspendResponse=0x27a0
# Looting
OP_LootRequest=0x0adf
OP_EndLootRequest=0x30f7
OP_LootItem=0x4dc9
OP_LootComplete=0x55c4
# bazaar trader stuff:
OP_BazaarSearch=0x39d6
OP_TraderDelItem=0x0000
OP_BecomeTrader=0x61b3
OP_TraderShop=0x31df
OP_Trader=0x4ef5
OP_TraderBuy=0x0000
OP_Barter=0x243a
OP_ShopItem=0x0000
OP_BazaarInspect=0x0000
OP_Bazaar=0x0000
OP_TraderItemUpdate=0x0000
# pc/npc trading
OP_TradeRequest=0x77b5
OP_TradeAcceptClick=0x69e2
OP_TradeRequestAck=0x14bf
OP_TradeCoins=0x4206
OP_FinishTrade=0x3993
OP_CancelTrade=0x354c
OP_TradeMoneyUpdate=0x68c2
OP_MoneyUpdate=0x640c
OP_TradeBusy=0x5505
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x7349
OP_FinishWindow2=0x40ef
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x189c
OP_ItemVerifyReply=0x097b
# merchant stuff
OP_ShopPlayerSell=0x791b
OP_ShopRequest=0x4fed
OP_ShopEnd=0x30a8
OP_ShopEndConfirm=0x3196
OP_ShopPlayerBuy=0x0ddd
OP_ShopDelItem=0x724f
# tradeskill stuff:
OP_ClickObject=0x4aa1
OP_ClickObjectAction=0x0c1e
OP_ClearObject=0x7a11
OP_RecipeDetails=0x6e02
OP_RecipesFavorite=0x71b1
OP_RecipesSearch=0x6290
OP_RecipeReply=0x1db6
OP_RecipeAutoCombine=0x40d7
OP_TradeSkillCombine=0x579a
# Tribute Packets:
OP_OpenGuildTributeMaster=0x378d
OP_OpenTributeMaster=0x7666
OP_SelectTribute=0x79fc
OP_TributeItem=0x4f3e
OP_TributeMoney=0x58fb
OP_TributeToggle=0x241d
OP_TributePointUpdate=0x5300
OP_TributeNPC=0x0000
OP_GuildTributeInfo=0x0000
OP_OpenTributeReply=0x0000
OP_GuildTributeStatus=0x0000
# Adventure packets:
OP_LeaveAdventure=0x5d18
OP_AdventureFinish=0x400f
OP_AdventureInfoRequest=0x3cb0
OP_AdventureInfo=0x4c54
OP_AdventureRequest=0x2c6c
OP_AdventureDetails=0x5648
OP_AdventureData=0x7171
OP_AdventureUpdate=0x1b01
OP_AdventureMerchantRequest=0x6922
OP_AdventureMerchantResponse=0x3e47
OP_AdventureMerchantPurchase=0x5b72
OP_AdventureMerchantSell=0x2f9b
OP_AdventurePointsUpdate=0x65c3
OP_AdventureStatsRequest=0x5a62
OP_AdventureStatsReply=0x2370
OP_AdventureLeaderboardRequest=0x7093
OP_AdventureLeaderboardReply=0x7f79
# Group Opcodes
OP_GroupDisband=0x4c10
OP_GroupInvite=0x6110
OP_GroupFollow=0x1649
OP_GroupUpdate=0x3abb
OP_GroupUpdateB=0x6194
OP_GroupCancelInvite=0x0000
OP_GroupAcknowledge=0x7323
OP_GroupDelete=0x0f6c
OP_CancelInvite=0x2a50
OP_GroupFollow2=0x2060
OP_GroupInvite2=0x32c2
OP_GroupDisbandYou=0x1ae5
OP_GroupDisbandOther=0x74da
OP_GroupLeaderChange=0x21b4
OP_GroupRoles=0x70e2
OP_GroupMakeLeader=0x4229
OP_DoGroupLeadershipAbility=0x6eae
OP_GroupLeadershipAAUpdate=0x02cf
OP_GroupMentor=0x3342
OP_InspectBuffs=0x486c
# LFG/LFP Opcodes
OP_LFGCommand=0x6060
OP_LFGGetMatchesRequest=0x0340
OP_LFGGetMatchesResponse=0x5048
OP_LFPGetMatchesRequest=0x4d7d
OP_LFPGetMatchesResponse=0x22c6
OP_LFPCommand=0x49a9
OP_LFGAppearance=0x0000
OP_LFGResponse=0x0000
# Raid Opcodes
OP_RaidInvite=0x55ac
OP_RaidUpdate=0x3973
OP_RaidJoin=0x0000
# Button-push commands
OP_Taunt=0x2703
OP_CombatAbility=0x3eba
OP_SenseTraps=0x02af
OP_PickPocket=0x39e8
OP_DisarmTraps=0x78bf
OP_Disarm=0x5ec8
OP_Sneak=0x5d55
OP_Fishing=0x1e2a
OP_InstillDoubt=0x640e
OP_FeignDeath=0x52fa
OP_Mend=0x0ecf
OP_Bind_Wound=0x0386
OP_LDoNOpen=0x3d5c
# Task packets
OP_TaskDescription=0x3714
OP_TaskActivity=0x08d3
OP_CompletedTasks=0x4eba
OP_TaskActivityComplete=0x5e19
OP_AcceptNewTask=0x0a23
OP_CancelTask=0x39f0
OP_TaskMemberList=0x5727
OP_OpenNewTasksWindow=0x48a2
OP_AvaliableTask=0x36e8
OP_TaskHistoryRequest=0x5f1c
OP_TaskHistoryReply=0x3d05
OP_DeclineAllTasks=0x0000
# Title opcodes
OP_NewTitlesAvailable=0x0d32
OP_RequestTitles=0x6344
OP_SendTitleList=0x2d08
OP_SetTitle=0x6527
OP_SetTitleReply=0x4c21
# mail opcodes
OP_Command=0x0000
OP_MailboxHeader=0x0000
OP_MailHeader=0x0000
OP_MailBody=0x0000
OP_NewMail=0x0000
OP_SentConfirm=0x0000
########### Below this point should not be needed ###########
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000
OP_LocInfo=0x0000
OP_ReloadUI=0x0000
OP_ItemName=0x0000
OP_ItemLinkText=0x0000
OP_MultiLineMsg=0x0000
OP_MendHPUpdate=0x0000
OP_TargetReject=0x0000
OP_SafePoint=0x0000
OP_ApproveZone=0x0000
OP_ZoneComplete=0x0000
OP_ClientError=0x0000
OP_DumpName=0x0000
OP_Heartbeat=0x0000
OP_CrashDump=0x0000
OP_LoginComplete=0x0000
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000
OP_PlayMP3=0x5770
OP_ReclaimCrystals=0x0000
OP_DynamicWall=0x0000
OP_OpenDiscordMerchant=0x0000
OP_DiscordMerchantInventory=0x0000
OP_GiveMoney=0x0000
OP_RequestKnowledgeBase=0x0000
OP_KnowledgeBase=0x0000
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000
OP_Some6ByteHPUpdate=0x0000 #seems to happen when you target group members
OP_QueryResponseThing=0x0000
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x46d3 # OP_SendSpellChecksum
#OP_LoginUnknown2=0x040b # OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 #search term for petition
OP_PetitionSearchResults=0x0000 #(list of?) matches from search
OP_PetitionSearchText=0x0000 #text results of search
OP_PetitionUpdate=0x0000
OP_PetitionCheckout=0x0000
OP_PetitionCheckIn=0x0000
OP_PetitionQue=0x0000
OP_PetitionUnCheckout=0x0000
OP_PetitionDelete=0x0000
OP_DeletePetition=0x0000
OP_PetitionResolve=0x0000
OP_PDeletePetition=0x0000
OP_PetitionBug=0x0000
OP_PetitionRefresh=0x0000
OP_PetitionCheckout2=0x0000
OP_PetitionViewPetition=0x0000
# Login opcodes
OP_SessionReady=0x0000
OP_Login=0x0000
OP_ServerListRequest=0x0000
OP_PlayEverquestRequest=0x0000
OP_PlayEverquestResponse=0x0000
OP_ChatMessage=0x0000
OP_LoginAccepted=0x0000
OP_ServerListResponse=0x0000
OP_Poll=0x0000
OP_EnterChat=0x0000
OP_PollResponse=0x0000
# raw opcodes
OP_RAWSessionRequest=0x0000
OP_RAWSessionResponse=0x0000
OP_RAWCombined=0x0000
OP_RAWSessionDisconnect=0x0000
OP_RAWKeepAlive=0x0000
OP_RAWSessionStatRequest=0x0000
OP_RAWSessionStatResponse=0x0000
OP_RAWPacket=0x0000
OP_RAWFragment=0x0000
OP_RAWOutOfOrderAck=0x0000
OP_RAWAck=0x0000
OP_RAWAppCombined=0x0000
OP_RAWOutOfSession=0x0000
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000
+9 -5
View File
@@ -158,7 +158,7 @@ OP_GMApproval=0x72fa # C
OP_GMToggle=0x7566 # C
OP_GMSummon=0x596d # C
OP_GMEmoteZone=0x3e7c # C
OP_GMEmoteWorld=0x3e7c # C
OP_GMEmoteWorld=0x5298 # C
OP_GMFind=0x6e27 # C
OP_GMKick=0x799c # C
OP_GMKill=0x6685 # C
@@ -288,8 +288,10 @@ OP_LeadershipExpToggle=0x34c5 # C
OP_LeadershipExpUpdate=0x69d0 # C
OP_PurchaseLeadershipAA=0x07b3 # C
OP_UpdateLeadershipAA=0x6948 # C
OP_MarkNPC=0x0d4b # C
OP_MarkNPC=0x695c # C
OP_MarkRaidNPC=0x0d4b # C
OP_ClearNPCMarks=0x5033 # C
OP_ClearRaidNPCMarks=0x5f55 # C
OP_DoGroupLeadershipAbility=0x540b # C
OP_GroupLeadershipAAUpdate=0x0c33
OP_DelegateAbility=0x0322 # C
@@ -367,7 +369,7 @@ OP_DzExpeditionEndsWarning=0x1879
OP_DzExpeditionList=0x3657
OP_DzMemberList=0x74e4
OP_DzCompass=0x35d3
OP_DzChooseZone=0xd8a
OP_DzChooseZone=0x0d8a
#0x1d99 was grouped with these too but I don't really know it's purpose.
# New Opcodes
@@ -484,6 +486,8 @@ OP_GroupDisbandOther=0x162d
OP_GroupLeaderChange=0x7545
OP_GroupRoles=0x6b67
OP_GroupMakeLeader=0x6087
OP_GroupMentor=0x1224
OP_InspectBuffs=0x66bf
# LFG/LFP Opcodes
OP_LFGCommand=0x3288 # C
OP_LFGGetMatchesRequest=0x5613 # C
@@ -527,7 +531,8 @@ OP_Shroud=0x6d1f
OP_ShroudRemove=0x17f6
OP_ShroudUnknown1=0x169a
OP_ShroudUnknown2=0x4292
OP_ShroudClearAA=0x3bef
OP_ClearAA=0x3bef
OP_ClearLeadershipAbilities=0x6e58
OP_ShroudSelectionWindow=0x4d79
OP_ShroudRequestStats=0x28ce
OP_ShroudRespondStats=0x33f2
@@ -576,7 +581,6 @@ OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_IncreaseStats=0x0000 #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
+14 -3
View File
@@ -85,6 +85,8 @@ OP_TaskActivity=0x2E60 #SEQ 12/04/08
OP_CompletedTasks=0x75AC #Derision 2009
OP_Weather=0x70A5 #SEQ 12/04/08
OP_SendAATable=0x6F05 #Trevius 12/20/08
OP_ClearAA=0x71b9
OP_ClearLeadershipAbilities=0x74e5
OP_UpdateAA=0x45D2 #Trevius 12/20/08
OP_RespondAA=0x4426 #Trevius 12/20/08
OP_ReqClientSpawn=0x014C #SEQ 12/04/08
@@ -281,8 +283,10 @@ OP_LeadershipExpToggle=0x24D4 #Xinu 02/20/09
OP_LeadershipExpUpdate=0x58b6 #Derision 2009
OP_PurchaseLeadershipAA=0x1408 #Derision 2009
OP_UpdateLeadershipAA=0x7abf #Derision 2009
OP_MarkNPC=0x00c6 #Derision 2009
OP_MarkNPC=0x4697 #Derision 2009
OP_MarkRaidNPC=0x00c6
OP_ClearNPCMarks=0x2ff2 #
OP_ClearRaidNPCMarks=0x56a9 #
OP_DoGroupLeadershipAbility=0x5a64 #Derision 2009
OP_DelegateAbility=0x57e3 #Derision 2009
OP_SetGroupTarget=0x1651 #Derision 2009
@@ -329,6 +333,7 @@ OP_InspectMessageUpdate=0x67e9 # C
OP_OpenInventory=0x66c8
OP_OpenContainer=0x10e3
OP_Marquee=0x2f75
OP_Untargetable=0x3e36
#expedition
OP_DzQuit=0x20d6
@@ -450,6 +455,8 @@ OP_GroupDelete=0x0000 #
OP_CancelInvite=0x596C #Trevius 03/02/09
OP_GroupFollow2=0x59D4 #Xinu 02/20/09
OP_GroupInvite2=0x07F6 #Xinu 02/20/09
OP_GroupMentor=0x9EF3
OP_InspectBuffs=0x3547
#LFG/LFP Opcodes
OP_LFGCommand=0x5D81 #Trevius 01/16/09
@@ -526,7 +533,7 @@ OP_MultiLineMsg=0x0000 #
OP_MendHPUpdate=0x0000 #
OP_TargetReject=0x0000 #
OP_SafePoint=0x0000 #
OP_IncreaseStats=0x0000 #
OP_IncreaseStats=0x5ecb #
OP_ApproveZone=0x0000 #
OP_ZoneComplete=0x0000 #
OP_ClientError=0x0000 #
@@ -540,9 +547,11 @@ OP_PickLockSuccess=0x0000 #
OP_VetRewardsAvaliable=0x044b #
OP_VetClaimRequest=0x7503
OP_VetClaimReply=0x01e1
OP_PlayMP3=0x0000 #
OP_PlayMP3=0x0d1c #
OP_ReclaimCrystals=0x0000 #
OP_CrystalCountUpdate=0x64C1 #
OP_CrystalCreate=0x65e2
OP_CrystalReclaim=0x0730
OP_DynamicWall=0x0000 #
OP_OpenDiscordMerchant=0x0000 #
OP_DiscordMerchantInventory=0x0000 #
@@ -615,6 +624,8 @@ OP_RAWOutOfSession=0x0000 #
OP_Some3ByteHPUpdate=0x0000 #initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
OP_ItemRecastDelay=0x0ada
# Opcodes from the client that are currently Unknowns:
# 0x3E85 - Sent when Guild Management window is opened
+2
View File
@@ -420,6 +420,8 @@ OP_RaidJoin=0x1f21 # ShowEQ 10/27/05
OP_RaidInvite=0x5891 # ShowEQ 10/27/05
OP_RaidUpdate=0x1f21 # EQEmu 06/29/05
OP_InspectBuffs=0x4FB6
OP_ZoneComplete=0x0000
OP_ItemLinkText=0x0000
@@ -88,6 +88,8 @@ OP_TaskActivity=0x31f3 # C
OP_CompletedTasks=0x687f # C
OP_Weather=0x4658 # V
OP_SendAATable=0x6ef9 # V
OP_ClearAA=0x2cd4
OP_ClearLeadershipAbilities=0x7b77
OP_UpdateAA=0x7bf6 # V
OP_RespondAA=0x1fbd # C 0x2bad
OP_ReqClientSpawn=0x69cd # V
@@ -292,8 +294,10 @@ OP_LeadershipExpToggle=0x5033 # C
OP_LeadershipExpUpdate=0x074f # C
OP_PurchaseLeadershipAA=0x5f55 # C
OP_UpdateLeadershipAA=0x77ed # C
OP_MarkNPC=0x3ec7 # C
OP_MarkNPC=0x66bf
OP_MarkRaidNPC=0x3ec7 # C
OP_ClearNPCMarks=0x5c29 # C
OP_ClearRaidNPCMarks=0x2af4
OP_DoGroupLeadershipAbility=0x0068 # C
OP_GroupLeadershipAAUpdate=0x167b # C
OP_DelegateAbility=0x6e58 # C
@@ -313,7 +317,7 @@ OP_OnLevelMessage=0x24cb # C
OP_AugmentInfo=0x31b1 # C
OP_Petition=0x31d1 # C
OP_SomeItemPacketMaybe=0x2c27 # C
OP_PVPStats=0x0000 #
OP_PVPStats=0x5272 #
OP_PVPLeaderBoardRequest=0x4973 # C
OP_PVPLeaderBoardReply=0x3842 # C
OP_PVPLeaderBoardDetailsRequest=0x6c75 # C
@@ -371,7 +375,17 @@ OP_DzExpeditionEndsWarning=0x6ac2
OP_DzExpeditionList=0x70d8
OP_DzMemberList=0x15c4
OP_DzCompass=0x01cb
OP_DzChooseZone=0x0000
OP_DzChooseZone=0x65e1
#shroud
OP_ShroudSelectionWindow=0x72ad
OP_ShroudRequestStats=0x488b
OP_ShroudRespondStats=0x1910
OP_ShroudSelect=0x45d7
OP_ShroudSelectCancel=0x666d
OP_ShroudProgress=0x6016 # This clears current progress and sets
OP_ShroudProgress2=0x66b4 # This just sets progress
OP_Shroud=0x1643
# New Opcodes
OP_SpawnPositionUpdate=0x4656 # C
@@ -487,6 +501,8 @@ OP_GroupDisbandOther=0x49f6 # C
OP_GroupLeaderChange=0x0c33 # C
OP_GroupRoles=0x116d # C
OP_GroupMakeLeader=0x5851
OP_GroupMentor=0x292f
OP_InspectBuffs=0x105b
# LFG/LFP Opcodes
OP_LFGCommand=0x2c38 # C
@@ -656,3 +672,6 @@ OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000 #
OP_ItemRecastDelay=0x82d7
# unhandled
OP_ShieldGroup=0x23a1
+214
View File
@@ -0,0 +1,214 @@
#!/usr/bin/perl
############################################################
#::: Script: DB_Dumper.pl
#::: Purpose: Utility to easily manage database backups and compress.
#::: Export Individual DB Tables...
#::: Export specific databases...
#::: Built for both Windows and Linux
#::: Windows uses WinRar or 7-Zip for compression
#::: Linux uses tar for compression
#::: Author: Akkadius
############################################################
$localdrive = "C:"; #::: Where Windows and all Install Programs are...
$linesep = "---------------------------------------";
use POSIX qw(strftime);
my $date = strftime "%m-%d-%Y", localtime;
print "\nTodays Date: " . $date . "\n";
use Config;
print "Operating System is: $Config{osname}\n";
if($Config{osname}=~/linux/i){ $OS = "Linux"; }
if($Config{osname}=~/Win|MS/i){ $OS = "Windows"; }
if(!$ARGV[0]){
print "\nERROR! Need arguments\n\n";
print "#::: Help :::#\n";
print "######################################################\n\n";
print "Arguments\n";
print " loc=\"C:\\File Location\" - File path location to backup...\n";
print " database=\"dbname\" - Manually specify databasename, default is database in eqemu_config.xml\n";
print " tables=\"table1,table2,table3\" - Manually specify tables, default is to dump all tables from database\n";
print " compress - Compress Database with 7-ZIP, will fallback to WinRAR depending on what is installed (Must be installed to default program dir)...\n";
print ' Example: perl DB_Dumper.pl Loc="E:\Backups"' . "\n\n";
print "######################################################\n";
exit;
}
#::: CONFIG VARIABLES - Parsed from eqemu_config.xml
my $confile = "eqemu_config.xml"; #default
open(F, "<$confile") or die "Unable to open config: $confile - This must be in your EQEmu Server Folder with your XML config\n";
my $indb = 0;
while(<F>) {
s/\r//g;
if(/<database>/i) { $indb = 1; }
next unless($indb == 1);
if(/<\/database>/i) { $indb = 0; last; }
if(/<host>(.*)<\/host>/i) { $host = $1; }
elsif(/<username>(.*)<\/username>/i) { $user = $1; }
elsif(/<password>(.*)<\/password>/i) { $pass = $1; }
elsif(/<db>(.*)<\/db>/i) { $db = $1; }
}
$Debug = 0;
print "Arguments\n" if $Debug;
$n = 0;
while($ARGV[$n]){
print $n . ': ' . $ARGV[$n] . "\n" if $Debug;
if($ARGV[$n]=~/compress/i){
print "Compression SET\n";
$Compress = 1;
}
if($ARGV[$n]=~/database=/i){
@DB_NAME = split('=', $ARGV[$n]);
print "Database is " . $DB_NAME[1] . "\n";
$db = $DB_NAME[1];
}
if($ARGV[$n]=~/loc=/i){
@B_LOC = split('=', $ARGV[$n]);
print "Backup Directory: " . $B_LOC[1] . "\n";
}
if($ARGV[$n]=~/tables=/i){
@Tables = split('=', $ARGV[$n]); @TList = split(',', $Tables[1]);
foreach my $tables (@TList){
$t_tables .= $tables . " ";
$t_tables_l .= $tables . "_";
$t_tables_p .= $tables . "\n";
}
print "Backing up tables: \n\n############################\n" . $t_tables_p . "############################\n\n";
}
$n++;
}
#::: Check for Backup Directory existence, if doesn't exist then create...
if (-d $B_LOC[1]) {
print "Directory currently exists... Adding files to it...\n\n";
}
elsif($B_LOC[1] ne ""){
print "Directory does NOT exist! Creating...\n\n";
mkdir($B_LOC[1]) or die 'Failed to create folder, maybe created the folder manually at "' . $B_LOC[1]. '" ?';
}
else{
print "No save location specified... Saving to folder script is running in...\n";
}
if($B_LOC[1] ne ""){
if($OS eq "Windows"){ $file_app = "\\"; }
if($OS eq "Linux"){ $file_app = "/"; }
}
else {
$file_app = "";
}
if($t_tables ne ""){
$tables_f_l = substr($t_tables_l, 0, 20) . '...';
$target_file = '' . $tables_f_l . ' ' . $date . '';
print "Performing table based backup...\n";
#::: Backup Database...
print "Backing up Database " . $db . "... \n\n";
$cmd = 'mysqldump -u' . $user . ' --host ' . $host . ' --max_allowed_packet=512M --password="' . $pass . '" ' . $db . ' ' . $t_tables . ' > "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql"';
printcmd($cmd);
system($cmd);
}
else{ #::: Entire DB Backup
$target_file = '' . $db . ' ' . $date . '';
#::: Backup Database...
print "Backing up Database " . $db . "... \n\n";
$cmd = 'mysqldump -u' . $user . ' --host ' . $host . ' --max_allowed_packet=512M --password="' . $pass . '" ' . $db . ' > "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql"';
printcmd($cmd);
system($cmd);
}
#::: Get File Size
$fileloc = '' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql';
$filesize = -s $fileloc;
if($filesize < 1000){ print "\n" . 'Error occurred... exiting...' . "\n\n"; exit; }
print "Backup DONE... DB Backup File Size '" . $filesize . "' (" . get_filesize_str($fileloc) . ")\n\n";
#::: WinRar Get, check compression flag
if($Compress == 1){
if($OS eq "Windows"){
if(-d $localdrive . "\\Program Files\\7-Zip"){
print " ::: You have 7-Zip installed as 64 Bit...\n\n";
$S_ZIP = $localdrive . "\\Program Files\\7-Zip";
}
elsif(-d $localdrive . "\\Program Files (x86)\\7-Zip"){
print " ::: You have 7-Zip installed as 32 Bit...\n\n";
$S_ZIP = $localdrive . "\\Program Files (x86)\\7-Zip";
}
elsif(-d $localdrive . "\\Program Files (x86)\\WinRAR"){
print " ::: You have WinRAR installed as 32 Bit...\n\n";
$WinRar = $localdrive . "\\Program Files (x86)\\WinRAR";
}
elsif(-d $localdrive . "\\Program Files\\WinRAR"){
print " ::: You have WinRAR installed as 64 Bit...\n\n";
$WinRar = $localdrive . "\\Program Files\\WinRAR";
}
else{
print "No WinRAR installed... Will not compress...\n";
}
if($S_ZIP ne ""){
print "Compressing Database with 7-ZIP... \n\n";
$cmd = '"' . $S_ZIP . '\\7z" a -t7z -m0=lzma -mx=9 "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.7z" "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql" ';
printcmd($cmd);
system($cmd);
print "\nDeleting RAW .sql Dump... \n\n";
$cmd = 'del "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql" ';
printcmd($cmd);
system($cmd);
$final_file = $target_file . ".7z";
}
elsif($WinRar ne ""){
print "Compressing Database with WinRAR... \n";
$cmd = '"' . $WinRar . '\\rar" a "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.rar" "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql" ';
printcmd($cmd);
system($cmd);
print "\nDeleting RAW .sql Dump... \n\n";
$cmd = 'del "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql" ';
printcmd($cmd);
system($cmd);
$final_file = $target_file . ".rar";
}
}
if($OS eq "Linux"){
print "Compressing Database with Tarball... \n";
$cmd = 'tar -zcvf "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.tar.gz" "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql" ';
printcmd($cmd);
system($cmd);
print "\nDeleting RAW .sql Dump... \n\n";
$cmd = 'rm "' . $B_LOC[1] . '' . $file_app . '' . $target_file . '.sql" ';
printcmd($cmd);
system($cmd);
$final_file = $target_file . ".tar.gz";
}
}
#::: Get Final File Location for display
if($B_LOC[1] ne ""){ $final_loc = $B_LOC[1] . '' . $file_app . ""; }
else{
if($OS eq "Windows"){
$final_loc = `echo %cd%`;
}
elsif($OS eq "Linux"){
$final_loc = `pwd`;
}
}
print "Final file located: " . $final_loc . "" . $final_file . "\n\n";
sub printcmd{
print "--- CMD --- \n" . $_[0] . "\n" . $linesep . "\n\n";
}
sub get_filesize_str{
my $file = shift();
my $size = (stat($file))[7] || die "stat($file): $!\n";
if ($size > 1099511627776) { return sprintf("%.2f TiB", $size / 1099511627776); }
elsif ($size > 1073741824) { return sprintf("%.2f GiB", $size / 1073741824); }
elsif ($size > 1048576) { return sprintf("%.2f MiB", $size / 1048576); }
elsif ($size > 1024) { return sprintf("%.2f KiB", $size / 1024); }
else { return "$size byte" . ($size == 1 ? "" : "s"); }
}
+466
View File
@@ -0,0 +1,466 @@
#!/usr/bin/perl
###########################################################
#::: Automatic (Database) Upgrade Script
#::: Author: Akkadius
#::: Purpose: To upgrade databases with ease and maintain versioning
###########################################################
$menu_displayed = 0;
use Config;
$console_output .= " Operating System is: $Config{osname}\n";
if($Config{osname}=~/linux/i){ $OS = "Linux"; }
if($Config{osname}=~/Win|MS/i){ $OS = "Windows"; }
#::: If current version is less than what world is reporting, then download a new one...
$current_version = 2;
if($ARGV[0] eq "V"){
if($ARGV[1] > $current_version){
print "eqemu_update.pl Automatic Database Upgrade Needs updating...\n";
print " Current version: " . $current_version . "\n";
print " New version: " . $ARGV[1] . "\n";
GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/eqemu_update.pl", "eqemu_update.pl");
exit;
}
else{
print "[Upgrade Script] No script update necessary \n";
}
exit;
}
$perl_version = $^V;
$perl_version =~s/v//g;
print "Perl Version is " . $perl_version . "\n";
if($perl_version > 5.12){ no warnings 'uninitialized'; }
no warnings;
my $confile = "eqemu_config.xml"; #default
open(F, "<$confile") or die "Unable to open config: $confile\n";
my $indb = 0;
while(<F>) {
s/\r//g;
if(/<database>/i) { $indb = 1; }
next unless($indb == 1);
if(/<\/database>/i) { $indb = 0; last; }
if(/<host>(.*)<\/host>/i) { $host = $1; }
elsif(/<username>(.*)<\/username>/i) { $user = $1; }
elsif(/<password>(.*)<\/password>/i) { $pass = $1; }
elsif(/<db>(.*)<\/db>/i) { $db = $1; }
}
$console_output =
"============================================================
EQEmu: Automatic Upgrade Check
============================================================
";
if($OS eq "Windows"){
$has_mysql_path = `echo %PATH%`;
if($has_mysql_path=~/MySQL|MariaDB/i){
@mysql = split(';', $has_mysql_path);
foreach my $v (@mysql){
if($v=~/MySQL|MariaDB/i){
$v =~s/\n//g;
$path = trim($v) . "/mysql";
last;
}
}
$console_output .= " (Windows) MySQL is in system path \n";
$console_output .= " Path = " . $path . "\n";
$console_output .= "============================================================\n";
}
}
#::: Linux Check
if($OS eq "Linux"){
$path = `which mysql`;
if ($path eq "") {
$path = `which mariadb`;
}
$path =~s/\n//g;
$console_output .= " (Linux) MySQL is in system path \n";
$console_output .= " Path = " . $path . "\n";
$console_output .= "============================================================\n";
}
#::: Path not found, error and exit
if($path eq ""){
print "MySQL path not found, please add the path for automatic database upgrading to continue... \n\n";
print "Exiting...\n";
exit;
}
#::: Create db_update working directory if not created
mkdir('db_update');
#::: Check if db_version table exists...
if(trim(GetMySQLResult("SHOW COLUMNS FROM db_version LIKE 'Revision'")) ne ""){
print GetMySQLResult("DROP TABLE db_version");
print "Old db_version table present, dropping...\n\n";
}
if(GetMySQLResult("SHOW TABLES LIKE 'db_version'") eq ""){
print GetMySQLResult("
CREATE TABLE db_version (
version int(11) DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO db_version (version) VALUES ('1000');");
print "Table 'db_version' does not exists.... Creating...\n\n";
}
if($OS eq "Windows"){ @db_version = split(': ', `world db_version`); }
if($OS eq "Linux"){ @db_version = split(': ', `./world db_version`); }
$bin_db_ver = trim($db_version[1]);
$local_db_ver = trim(GetMySQLResult("SELECT version FROM db_version LIMIT 1"));
#::: If ran from Linux startup script, supress output
if($bin_db_ver == $local_db_ver && $ARGV[0] eq "ran_from_start"){
print "Database up to date...\n";
exit;
}
else{
print $console_output;
}
print " Binary Database Version: (" . $bin_db_ver . ")\n";
print " Local Database Version: (" . $local_db_ver . ")\n\n";
#::: If World ran this script, and our version is up to date, continue...
if($bin_db_ver <= $local_db_ver && $ARGV[0] eq "ran_from_world"){
print " Database up to Date: Continuing World Bootup...\n";
print "============================================================\n";
exit;
}
print "Retrieving latest database manifest...\n";
GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/db_update_manifest.txt", "db_update/db_update_manifest.txt");
# GetRemoteFile("https://dl.dropboxusercontent.com/u/50023467/dl/db_update_manifest.txt", "db_update/db_update_manifest.txt");
if($local_db_ver < $bin_db_ver && $ARGV[0] eq "ran_from_world"){
print "You have missing database updates, type 1 or 2 to backup your database before running them as recommended...\n\n";
#::: Display Menu
ShowMenuPrompt();
}
else{
#::: Most likely ran standalone
print "\n";
ShowMenuPrompt();
}
sub ShowMenuPrompt {
my %dispatch = (
1 => \&database_dump,
2 => \&database_dump_compress,
3 => \&Run_Database_Check,
4 => \&AA_Fetch,
5 => \&OpCodes_Fetch,
0 => \&Exit,
);
while (1) {
{
local $| = 1;
if(!$menu_show && ($ARGV[0] eq "ran_from_world" || $ARGV[0] eq "ran_from_start")){
$menu_show++;
next;
}
print MenuOptions(), '> ';
$menu_displayed++;
if($menu_displayed > 50){
print "Safety: Menu looping too many times, exiting...\n";
exit;
}
}
my $choice = <>;
$choice =~ s/\A\s+//;
$choice =~ s/\s+\z//;
if (defined(my $handler = $dispatch{$choice})) {
my $result = $handler->();
unless (defined $result) {
exit 0;
}
}
else {
if($ARGV[0] ne "ran_from_world"){
# warn "\n\nInvalid selection\n\n";
}
}
}
}
sub MenuOptions {
if(@total_updates){
$option[3] = "Run pending REQUIRED updates... (" . scalar (@total_updates) . ")";
}
else{
$option[3] = "Check for pending REQUIRED Database updates
Stages updates for automatic upgrade...";
}
return <<EO_MENU;
Database Management Menu (Please Select):
1) Backup Database - (Saves to Backups folder)
Ideal to perform before performing updates
2) Backup Database Compressed - (Saves to Backups folder)
Ideal to perform before performing updates
3) $option[3]
4) AAs - Get Latest AA's from PEQ (This deletes AA's already in the database)
5) OPCodes - Download latest opcodes from repository
0) Exit
EO_MENU
}
sub CheckForDatabaseDumpScript{
if(`perl db_dumper.pl`=~/Need arguments/i){
return;
}
else{
print "db_dumper.pl not found... retrieving...\n\n";
GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/scripts/db_dumper.pl", "db_dumper.pl");
}
}
sub ran_from_world {
print "Running from world...\n";
}
sub database_dump {
CheckForDatabaseDumpScript();
print "Performing database backup....\n";
print `perl db_dumper.pl database="$db" loc="backups"`;
}
sub database_dump_compress {
CheckForDatabaseDumpScript();
print "Performing database backup....\n";
print `perl db_dumper.pl database="$db" loc="backups" compress`;
}
sub Exit{ }
#::: Returns Tab Delimited MySQL Result from Command Line
sub GetMySQLResult{
my $run_query = $_[0];
if($OS eq "Windows"){ return `"$path" --host $host --user $user --password="$pass" $db -N -B -e "$run_query"`; }
if($OS eq "Linux"){
$run_query =~s/`//g;
return `$path --user="$user" --host $host --password="$pass" $db -N -B -e "$run_query"`;
}
}
sub GetMySQLResultFromFile{
my $update_file = $_[0];
if($OS eq "Windows"){ return `"$path" --host $host --user $user --password="$pass" --force $db < $update_file`; }
if($OS eq "Linux"){ return `"$path" --host $host --user $user --password="$pass" --force $db < $update_file`; }
}
#::: Gets Remote File based on URL (1st Arg), and saves to destination file (2nd Arg)
#::: Example: GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/db_update_manifest.txt", "db_update/db_update_manifest.txt");
sub GetRemoteFile{
my $URL = $_[0];
my $Dest_File = $_[1];
if($OS eq "Windows"){
require LWP::UserAgent;
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->env_proxy;
my $response = $ua->get($URL);
if ($response->is_success){
open (FILE, '> ' . $Dest_File . '');
print FILE $response->decoded_content;
close (FILE);
print " URL: " . $URL . "\n";
print " Saved: " . $Dest_File . " \n";
}
else {
print "Error, no connection to the internet...\n\n";
die $response->status_line;
}
}
if($OS eq "Linux"){
#::: wget -O db_update/db_update_manifest.txt https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/db_update_manifest.txt
$wget = `wget --no-check-certificate --quiet -O $Dest_File $URL`;
print " URL: " . $URL . "\n";
print " Saved: " . $Dest_File . " \n";
if($wget=~/unable to resolve/i){
print "Error, no connection to the internet...\n\n";
die;
}
}
}
#::: Trim Whitespaces
sub trim {
my $string = $_[0];
$string =~ s/^\s+//;
$string =~ s/\s+$//;
return $string;
}
#::: Fetch Latest PEQ AA's
sub AA_Fetch{
print "Pulling down PEQ AA Tables...\n";
GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/peq_aa_tables.sql", "db_update/peq_aa_tables.sql");
print "\n\nInstalling AA Tables...\n";
print GetMySQLResultFromFile("db_update/peq_aa_tables.sql");
print "\nDone...\n\n";
}
#::: Fetch Latest Opcodes
sub OpCodes_Fetch{
print "Pulling down latest opcodes...\n";
%opcodes = (
1 => ["opcodes", "https://raw.githubusercontent.com/EQEmu/Server/master/utils/patches/opcodes.conf"],
2 => ["mail_opcodes", "https://raw.githubusercontent.com/EQEmu/Server/master/utils/patches/mail_opcodes.conf"],
3 => ["Titanium", "https://raw.githubusercontent.com/EQEmu/Server/master/utils/patches/patch_Titanium.conf"],
4 => ["Secrets of Faydwer", "https://raw.githubusercontent.com/EQEmu/Server/master/utils/patches/patch_SoF.conf"],
5 => ["Seeds of Destruction", "https://raw.githubusercontent.com/EQEmu/Server/master/utils/patches/patch_SoD.conf"],
6 => ["Underfoot", "https://raw.githubusercontent.com/EQEmu/Server/master/utils/patches/patch_UF.conf"],
7 => ["Rain of Fear", "https://raw.githubusercontent.com/EQEmu/Server/master/utils/patches/patch_RoF.conf"],
8 => ["Rain of Fear 2", "https://raw.githubusercontent.com/EQEmu/Server/master/utils/patches/patch_RoF2.conf"],
);
$loop = 1;
while($opcodes{$loop}[0]){
#::: Split the URL by the patches folder to get the file name from URL
@real_file = split("patches/", $opcodes{$loop}[1]);
$find = 0;
while($real_file[$find]){
$file_name = $real_file[$find];
$find++;
}
print "\nDownloading (" . $opcodes{$loop}[0] . ") File: '" . $file_name . "'...\n\n";
GetRemoteFile($opcodes{$loop}[1], $file_name);
$loop++;
}
print "\nDone...\n\n";
}
#::: Responsible for Database Upgrade Routines
sub Run_Database_Check{
#::: Run 2 - Running pending updates...
if(defined(@total_updates)){
@total_updates = sort @total_updates;
foreach my $val (@total_updates){
$file_name = trim($m_d{$val}[1]);
print "Running Update: " . $val . " - " . $file_name . "\n";
print GetMySQLResultFromFile("db_update/$file_name");
print GetMySQLResult("UPDATE db_version SET version = $val WHERE version < $val");
}
}
#::: Run 1 - Initial checking of needed updates...
print "Reading manifest...\n\n";
use Data::Dumper;
open (FILE, "db_update/db_update_manifest.txt");
while (<FILE>) {
chomp;
$o = $_;
if($o=~/#/i){ next; }
@manifest = split('\|', $o);
$m_d{$manifest[0]} = [@manifest];
}
@total_updates = ();
#::: Iterate through Manifest backwards from binary version down to local version...
for($i = $bin_db_ver; $i > 1000; $i--){
if(!defined($m_d{$i}[0])){ next; }
$file_name = trim($m_d{$i}[1]);
$query_check = trim($m_d{$i}[2]);
$match_type = trim($m_d{$i}[3]);
$match_text = trim($m_d{$i}[4]);
#::: Match type update
if($match_type eq "contains"){
if(trim(GetMySQLResult($query_check))=~/$match_text/i){
print "Missing DB Update " . $i . " '" . $file_name . "' \n";
FetchMissingUpdate($i, $file_name);
push(@total_updates, $i);
}
else{
print "DB up to date with: " . $i . " - '" . $file_name . "' \n";
}
print_match_debug();
print_break();
}
if($match_type eq "missing"){
if(GetMySQLResult($query_check)=~/$match_text/i){
print "DB up to date with: " . $i . " - '" . $file_name . "' \n";
next;
}
else{
print "Missing DB Update " . $i . " '" . $file_name . "' \n";
FetchMissingUpdate($i, $file_name);
push(@total_updates, $i);
}
print_match_debug();
print_break();
}
if($match_type eq "empty"){
if(GetMySQLResult($query_check) eq ""){
print "Missing DB Update " . $i . " '" . $file_name . "' \n";
FetchMissingUpdate($i, $file_name);
push(@total_updates, $i);
}
else{
print "DB up to date with: " . $i . " - '" . $file_name . "' \n";
}
print_match_debug();
print_break();
}
if($match_type eq "not_empty"){
if(GetMySQLResult($query_check) ne ""){
print "Missing DB Update " . $i . " '" . $file_name . "' \n";
FetchMissingUpdate($i, $file_name);
push(@total_updates, $i);
}
else{
print "DB up to date with: " . $i . " - '" . $file_name . "' \n";
}
print_match_debug();
print_break();
}
}
print "\n";
if(scalar (@total_updates) == 0){
print "No updates need to be run...\n";
print "Setting Database to Binary Version (" . $bin_db_ver . ") if not already...\n\n";
GetMySQLResult("UPDATE db_version SET version = $bin_db_ver");
}
}
sub FetchMissingUpdate{
$db_update = $_[0];
$update_file = $_[1];
if($db_update >= 9000){
GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/git/required/" . $update_file, "db_update/" . $update_file . "");
}
elsif($db_update >= 5000 && $db_update <= 9000){
GetRemoteFile("https://raw.githubusercontent.com/EQEmu/Server/master/utils/sql/svn/" . $update_file, "db_update/" . $update_file . "");
}
}
sub print_match_debug{
if(!$debug){ return; }
print " Match Type: '" . $match_type . "'\n";
print " Match Text: '" . $match_text . "'\n";
print " Query Check: '" . $query_check . "'\n";
print " Result: '" . trim(GetMySQLResult($query_check)) . "'\n";
}
sub print_break{
if(!$debug){ return; }
print "\n==============================================\n";
}
+3
View File
@@ -0,0 +1,3 @@
# Input and Output txt and conf files
*.txt
*.conf
@@ -0,0 +1,66 @@
#!/usr/bin/perl
# File Name: conf_to_oplist.pl
# Converts a Patch File into the Opcode List with Opcode Names for the Spreadsheet.
# Directions to use this script:
# 1. Paste the contents of the current patch file in the patch_OLD.conf file.
# 2. Run this script using "perl conf_to_oplist.pl"
# 3. This updates the opcodelist.txt with the values from the Patch File.
$stopmessage = "Failed to open file";
open OpcodeFile, "<", "opcodelist.txt" or die $stopmessage;
open PatchFile, "<", "patch_OLD.conf" or die $stopmessage;
my @OpcodeList = <OpcodeFile>;
my @PatchFile = <PatchFile>;
my %PatchHash = ();
foreach $line (@PatchFile)
{
@equalssplit = split(/=/, $line);
$ArraySize = @equalssplit;
if ($ArraySize > 1)
{
@OpcodeArray = split(//, $equalssplit[1]);
$CurOpcode = $OpcodeArray[0].$OpcodeArray[1].$OpcodeArray[2].$OpcodeArray[3].$OpcodeArray[4].$OpcodeArray[5];
$CurOpcode = lc($CurOpcode);
# Opcode Name => Opcode
$PatchHash{ $CurOpcode } = $equalssplit[0];
}
}
close(OpcodeFile);
close(PatchFile);
# Clear out file contents
open OpcodeResultFile, ">", "opcodelist.txt" or die $stopmessage;
print OpcodeResultFile "";
close(OpcodeResultFile);
open OpcodeResultFile, ">>", "opcodelist.txt" or die $stopmessage;
while( my ($k, $v) = each %$PatchFile )
{
#print OpcodeResultFile "key: $k, value: $v.\n";
}
$TabSpace = " "; # Tab
foreach $line (@OpcodeList)
{
@LineSplit = split(//, $line);
$CurOpcode = $LineSplit[0].$LineSplit[1].$LineSplit[2].$LineSplit[3].$LineSplit[4].$LineSplit[5];
$CurOpcode = lc($CurOpcode);
$OpcodeName = ""; # Tab
if ($PatchHash{$CurOpcode})
{
$NameKey = $PatchHash{$CurOpcode};
$OpcodeName = $NameKey;
}
$CurLine = $CurOpcode.$TabSpace.$OpcodeName."\n";
print OpcodeResultFile $CurLine;
}
close(OpcodeResultFile);
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,89 @@
#!/usr/bin/perl
# File Name: oplist_to_conf.pl
# Converts the Opcode List with Opcode Names from the Spreadsheet into a Patch File.
# Directions to use this script:
# 1. Copy the opcodes and opcode names columns from the opcode spreadsheet
# for the columns you want to create a new .conf file from into the file.
# 2. Remove the header row entries in the text file.
# 3. Find/Replace all Tabs " " with 2 spaces " " and save the file.
# 4. Paste the contents of the current patch file in the patch_OLD.conf file.
# 5. Run this script using "perl oplist_to_conf.pl"
# 6. This creates a new .conf file named patch_NEW.conf
# 7. Rename patch_NEW.conf to the desired name and you are all done
$stopmessage = "Failed to open file";
# Open the text file that contains the opcode and opcode name rows for a single client from the opcode list spreadsheet
open OpcodeFile, "<", "opcodelist.txt" or die $stopmessage;
# Open the .conf file to copy from
open PatchFile, "<", "patch_OLD.conf" or die $stopmessage;
# Read these files into arrays for looping and close the files
my @OpcodeList = <OpcodeFile>;
my @PatchFile = <PatchFile>;
close(OpcodeFile);
close(PatchFile);
# Open the new/destination .conf file and clear out file contents
open OpcodeResultFile, ">", "patch_NEW.conf" or die $stopmessage;
print OpcodeResultFile "";
# Close out the newly cleared .conf file
close(OpcodeResultFile);
# Open the new/destination .conf file again for appending
open OpcodeResultFile, ">>", "patch_NEW.conf" or die $stopmessage;
my %PatchHash = ();
foreach $line (@OpcodeList)
{
@equalssplit = split(/ /, $line);
$ArraySize = @equalssplit;
if ($ArraySize > 1)
{
my $CurOpcode = "";
my $CurOpcodeName = "";
@OpcodeArray = split(//, $equalssplit[0]);
if ($equalssplit[1] =~ /^OP_(.*)/i)
{
$CurOpcodeName = "OP_".$1;
}
foreach $Letter (@OpcodeArray)
{
if ($Letter =~ /[A-Za-z0-9]/)
{
$CurOpcode .= $Letter;
}
}
if ($CurOpcode && $CurOpcodeName)
{
$CurOpcode = lc($CurOpcode);
$PatchHash{ $CurOpcodeName } = $CurOpcode;
#print $CurOpcodeName."=". $CurOpcode."\n";
}
}
}
$TabSpace = " "; # Tab
foreach $line (@PatchFile)
{
$CurLine = $line;
if ($line =~ /^OP_([^\=]+)=([^\s]+)(.*)/i)
{
$NewOpcode = "0x0000";
$OpcodeName = "OP_".$1;
if ($PatchHash{$OpcodeName})
{
$NewOpcode = $PatchHash{$OpcodeName};
}
$CurLine = $OpcodeName."=".$NewOpcode.$3."\n";
}
print OpcodeResultFile $CurLine;
}
close(OpcodeResultFile);
+660
View File
@@ -0,0 +1,660 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x7a09
OP_ApproveWorld=0x7499
OP_LogServer=0x7ceb
OP_SendCharInfo=0x00d2
OP_ExpansionInfo=0x590d
OP_GuildsList=0x0000
OP_EnterWorld=0x578f
OP_PostEnterWorld=0x6259
OP_World_Client_CRC1=0x12cc
OP_World_Client_CRC2=0x0f13
OP_SendSpellChecksum=0x0000
OP_SendSkillCapsChecksum=0x0000
# Character Select Related:
OP_SendMaxCharacters=0x5475
OP_SendMembership=0x7acc
OP_SendMembershipDetails=0x057b
OP_CharacterCreateRequest=0x6773
OP_CharacterCreate=0x6bbf
OP_DeleteCharacter=0x1808
OP_RandomNameGenerator=0x5954
OP_ApproveName=0x56a2
OP_MOTD=0x0c22
OP_SetChatServer=0x1bc5
OP_SetChatServer2=0x7eec
OP_ZoneServerInfo=0x4c44
OP_WorldComplete=0x4493
OP_WorldUnknown001=0x2301
OP_FloatListThing=0x46c6
# Reasons for Disconnect:
OP_ZoneUnavail=0x4cb4
OP_WorldClientReady=0x23c1
OP_CharacterStillInZone=0x0000
OP_WorldChecksumFailure=0x0000
OP_WorldLoginFailed=0x0000
OP_WorldLogout=0x0000
OP_WorldLevelTooHigh=0x0000
OP_CharInacessable=0x0000
OP_UserCompInfo=0x0000
OP_SendExeChecksum=0x0000
OP_SendBaseDataChecksum=0x0000
# Zone in opcodes
OP_AckPacket=0x471d
OP_ZoneEntry=0x5089
OP_ReqNewZone=0x7887
OP_NewZone=0x1795
OP_ZoneSpawns=0x5237
OP_PlayerProfile=0x6506
OP_TimeOfDay=0x5070
OP_LevelUpdate=0x1eec
OP_Stamina=0x2a79
OP_RequestClientZoneChange=0x3fcf
OP_ZoneChange=0x2d18
OP_LockoutTimerInfo=0x0000
OP_ZoneServerReady=0x0000
OP_ZoneInUnknown=0x0000
OP_LogoutReply=0x0000
OP_PreLogoutReply=0x0000
# Required to fully log in
OP_SpawnAppearance=0x0971
OP_ChangeSize=0x4707
OP_TributeUpdate=0x5961
OP_TributeTimer=0x073d
OP_SendTributes=0x729b
OP_SendGuildTributes=0x1877
OP_TributeInfo=0x4254
OP_Weather=0x661e
OP_ReqClientSpawn=0x35fa
OP_SpawnDoor=0x7291
OP_GroundSpawn=0x6fca
OP_SendZonepoints=0x69a4
OP_BlockedBuffs=0x3033
OP_RemoveBlockedBuffs=0x0de7
OP_ClearBlockedBuffs=0x34cb
OP_WorldObjectsSent=0x5ae2
OP_SendExpZonein=0x5f8e
OP_SendAATable=0x66b5
OP_RespondAA=0x7a27
OP_UpdateAA=0x66f0
OP_SendAAStats=0x43c8
OP_AAExpUpdate=0x7d14
OP_ExpUpdate=0x20ed
OP_HPUpdate=0x2828
OP_ManaChange=0x5467
OP_TGB=0x0876
OP_SpecialMesg=0x0083
OP_GuildMemberList=0x12a6
OP_GuildMOTD=0x3e13
OP_CharInventory=0x5ca6
OP_WearChange=0x7994
OP_ClientUpdate=0x7dfc
OP_ClientReady=0x345d
OP_SetServerFilter=0x444d
# Guild Opcodes - Disabled until crashes are resolved in RoF
OP_GetGuildMOTD=0x36e0
OP_GetGuildMOTDReply=0x4f1f
OP_GuildMemberUpdate=0x69b9
OP_GuildInvite=0x7099
OP_GuildRemove=0x1444
OP_GuildPeace=0x67e3
OP_SetGuildMOTD=0x0b0b
OP_GuildList=0x6279
OP_GuildWar=0x1ffb
OP_GuildLeader=0x7e09
OP_GuildDelete=0x3708
OP_GuildInviteAccept=0x7053
OP_GuildDemote=0x2d4e
OP_GuildPromote=0x0000
OP_GuildPublicNote=0x5053
OP_GuildManageBanker=0x748f
OP_GuildBank=0x5134
OP_SetGuildRank=0x0b9c
OP_GuildUpdateURLAndChannel=0x2958
OP_GuildStatus=0x7326
OP_GuildCreate=0x76d9
OP_GuildMemberLevelUpdate=0x0000 # Unused?
OP_ZoneGuildList=0x0000 # Unused?
OP_GetGuildsList=0x0000 # Unused?
OP_LFGuild=0x0000
OP_GuildManageRemove=0x0000
OP_GuildManageAdd=0x0000
OP_GuildManageStatus=0x0000
# GM/Guide Opcodes
OP_GMServers=0x08c1
OP_GMBecomeNPC=0x3ae1
OP_GMZoneRequest=0x62ac
OP_GMZoneRequest2=0x7e1a
OP_GMGoto=0x7d8e
OP_GMSearchCorpse=0x357c
OP_GMHideMe=0x79c5
OP_GMDelCorpse=0x607e
OP_GMApproval=0x6db5
OP_GMToggle=0x2097
OP_GMSummon=0x486f
OP_GMEmoteZone=0x1cfd
OP_GMEmoteWorld=0x458e
OP_GMFind=0x4a8f
OP_GMKick=0x26a7
OP_GMKill=0x51d3
OP_GMNameChange=0x035f
OP_GMLastName=0x46ce
# Misc Opcodes
OP_InspectRequest=0x57bc
OP_InspectAnswer=0x71ac
OP_InspectMessageUpdate=0x4d25
OP_BeginCast=0x318f
OP_ColoredText=0x43af
OP_ConsentResponse=0x384a
OP_MemorizeSpell=0x217c
OP_SwapSpell=0x0efa
OP_CastSpell=0x1287
OP_Consider=0x742b
OP_FormattedMessage=0x1024
OP_SimpleMessage=0x213f
OP_Buff=0x659c
OP_Illusion=0x312a
OP_MoneyOnCorpse=0x5f44
OP_RandomReply=0x106b
OP_DenyResponse=0x2382
OP_SkillUpdate=0x04c
OP_GMTrainSkillConfirm=0x4b64
OP_RandomReq=0x7b10
OP_Death=0x6517
OP_GMTraining=0x1966
OP_GMEndTraining=0x4d6b
OP_GMTrainSkill=0x2a85
OP_Animation=0x7177
OP_Begging=0x6703
OP_Consent=0x1fd1
OP_ConsentDeny=0x7a45
OP_AutoFire=0x241e
OP_PetCommands=0x0159
OP_DeleteSpell=0x52e5
OP_Surname=0x0423
OP_ClearSurname=0x3fb0
OP_FaceChange=0x5578
OP_SenseHeading=0x260a
OP_Action=0x744c
OP_ConsiderCorpse=0x5204
OP_HideCorpse=0x49e1
OP_CorpseDrag=0x0904
OP_CorpseDrop=0x7037
OP_Bug=0x73f4
OP_Feedback=0x5602
OP_Report=0x1414
OP_Damage=0x6f15
OP_ChannelMessage=0x2b2d
OP_Assist=0x4478
OP_AssistGroup=0x27f8
OP_MoveCoin=0x0bcf
OP_ZonePlayerToBind=0x0ecb
OP_KeyRing=0x6857
OP_WhoAllRequest=0x674b
OP_WhoAllResponse=0x578c
OP_FriendsWho=0x3956
OP_ConfirmDelete=0x43a3
OP_Logout=0x4ac6
OP_Rewind=0x1745
OP_TargetCommand=0x58e2
OP_Hide=0x67fe
OP_Jump=0x31f4
OP_Camp=0x28ec
OP_Emote=0x373b
OP_SetRunMode=0x009f
OP_BankerChange=0x791e
OP_TargetMouse=0x075d
OP_MobHealth=0x37b1
OP_InitialMobHealth=0x0000 # Unused?
OP_TargetHoTT=0x0272
OP_XTargetResponse=0x672f
OP_XTargetRequest=0x45be
OP_XTargetAutoAddHaters=0x792c
OP_TargetBuffs=0x4f4b
OP_BuffCreate=0x3377
OP_BuffRemoveRequest=0x64f2
OP_DeleteSpawn=0x7280
OP_AutoAttack=0x109d
OP_AutoAttack2=0x3526
OP_Consume=0x4b70
OP_MoveItem=0x32ee
OP_DeleteItem=0x18ad
OP_DeleteCharge=0x01b8
OP_ItemPacket=0x368e
OP_ItemLinkResponse=0x70c0
OP_ItemLinkClick=0x4cef
OP_ItemPreview=0x6b5c
OP_NewSpawn=0x6097
OP_Track=0x17e5
OP_TrackTarget=0x0029
OP_TrackUnknown=0x4577
OP_ClickDoor=0x3a8f
OP_MoveDoor=0x08e8
OP_RemoveAllDoors=0x700c
OP_EnvDamage=0x51fd
OP_BoardBoat=0x4211
OP_Forage=0x5306
OP_LeaveBoat=0x7617
OP_ControlBoat=0x0ae7
OP_SafeFallSuccess=0x2219
OP_RezzComplete=0x760d
OP_RezzRequest=0x3c21
OP_RezzAnswer=0x701c
OP_Shielding=0x48c1
OP_RequestDuel=0x3af1
OP_MobRename=0x2c57
OP_AugmentItem=0x661b
OP_WeaponEquip1=0x34a7
OP_WeaponEquip2=0x559a
OP_WeaponUnequip2=0x2d25
OP_ApplyPoison=0x31e6
OP_Save=0x4a39
OP_TestBuff=0x7cb8
OP_CustomTitles=0x100e
OP_Split=0x3a54
OP_YellForHelp=0x4e56
OP_LoadSpellSet=0x261d
OP_Bandolier=0x7677
OP_PotionBelt=0x1a3e
OP_DuelResponse=0x6a46
OP_DuelResponse2=0x68d3
OP_SaveOnZoneReq=0x600d
OP_ReadBook=0x72df
OP_Dye=0x23b9
OP_InterruptCast=0x048c
OP_AAAction=0x424e
OP_LeadershipExpToggle=0x6c55
OP_LeadershipExpUpdate=0x2797
OP_PurchaseLeadershipAA=0x0026
OP_UpdateLeadershipAA=0x026
OP_MarkNPC=0x5a58
OP_MarkRaidNPC=0x74bd #unimplemented
OP_ClearNPCMarks=0x2003
OP_ClearRaidNPCMarks=0x20d3 #unimplemented
OP_DelegateAbility=0x76b8
OP_SetGroupTarget=0x2814
OP_Charm=0x5d92
OP_Stun=0x36a4
OP_SendFindableNPCs=0x4613
OP_FindPersonRequest=0x5cea
OP_FindPersonReply=0x7e58
OP_Sound=0x1a30
OP_PetBuffWindow=0x5882
OP_LevelAppearance=0x3bc9
OP_Translocate=0x6580
OP_Sacrifice=0x1821
OP_PopupResponse=0x08a6
OP_OnLevelMessage=0x4d6e
OP_AugmentInfo=0x0afb
OP_Petition=0x1901
OP_SomeItemPacketMaybe=0x747c
OP_PVPStats=0x4b15
OP_PVPLeaderBoardRequest=0x04aa
OP_PVPLeaderBoardReply=0x071f
OP_PVPLeaderBoardDetailsRequest=0x3707
OP_PVPLeaderBoardDetailsReply=0x25b7
OP_RestState=0x000f
OP_RespawnWindow=0x28bc
OP_LDoNButton=0x5327
OP_SetStartCity=0x6326
OP_VoiceMacroIn=0x17fd
OP_VoiceMacroOut=0x409a
OP_ItemViewUnknown=0x465b
OP_VetRewardsAvaliable=0x590e
OP_VetClaimRequest=0x1126
OP_VetClaimReply=0x16d4
OP_DisciplineUpdate=0x759e
OP_DisciplineTimer=0x6989
OP_BecomeCorpse=0x0000 # Unused?
OP_Action2=0x0000 # Unused?
OP_MobUpdate=0x2c84
OP_NPCMoveUpdate=0x5892
OP_CameraEffect=0x127f
OP_SpellEffect=0x5936
OP_RemoveNimbusEffect=0x7b1e
OP_AltCurrency=0x6b6d
OP_AltCurrencyMerchantRequest=0x5409
OP_AltCurrencyMerchantReply=0x27a2
OP_AltCurrencyPurchase=0x3788
OP_AltCurrencySell=0x40b6
OP_AltCurrencySellSelection=0x532a
OP_AltCurrencyReclaim=0x0339
OP_CrystalCountUpdate=0x467f
OP_CrystalCreate=0x7aee
OP_CrystalReclaim=0x2439
OP_Untargetable=0x053c
OP_IncreaseStats=0x70a3
OP_Weblink=0x6f4b
OP_OpenContainer=0x0000
OP_Marquee=0x502e
OP_ItemRecastDelay=0x15a9
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
OP_DzQuit=0x205f
OP_DzListTimers=0x0398
OP_DzAddPlayer=0x59ca
OP_DzRemovePlayer=0x4701
OP_DzSwapPlayer=0x1abc
OP_DzMakeLeader=0x405b
OP_DzPlayerList=0x543d
OP_DzJoinExpeditionConfirm=0x14c6
OP_DzJoinExpeditionReply=0x7f4b
OP_DzExpeditionInfo=0x4f7e
OP_DzExpeditionList=0x9119
OP_DzMemberStatus=0xb2e3
OP_DzLeaderStatus=0x32f0
OP_DzExpeditionEndsWarning=0x7e94
OP_DzMemberList=0x3de9
OP_DzCompass=0x3e0e
OP_DzChooseZone=0x0b7d
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
OP_ManaUpdate=0x3791
OP_EnduranceUpdate=0x5f42
OP_MobManaUpdate=0x2404
OP_MobEnduranceUpdate=0x1c81
# Mercenary Opcodes
OP_MercenaryDataUpdateRequest=0x7b89
OP_MercenaryDataUpdate=0x61a4
OP_MercenaryDataRequest=0x11c1
OP_MercenaryDataResponse=0x72ce
OP_MercenaryHire=0x7169
OP_MercenaryDismiss=0x6e83
OP_MercenaryTimerRequest=0x31e4
OP_MercenaryTimer=0x0763
OP_MercenaryUnknown1=0x5d26
OP_MercenaryCommand=0x27f2
OP_MercenarySuspendRequest=0x4407
OP_MercenarySuspendResponse=0x6f03
OP_MercenaryUnsuspendResponse=0x27a0
# Looting
OP_LootRequest=0x0adf
OP_EndLootRequest=0x30f7
OP_LootItem=0x4dc9
OP_LootComplete=0x55c4
# bazaar trader stuff:
OP_BazaarSearch=0x39d6
OP_TraderDelItem=0x0000
OP_BecomeTrader=0x61b3
OP_TraderShop=0x31df
OP_Trader=0x4ef5
OP_TraderBuy=0x0000
OP_Barter=0x243a
OP_ShopItem=0x0000
OP_BazaarInspect=0x0000
OP_Bazaar=0x0000
OP_TraderItemUpdate=0x0000
# pc/npc trading
OP_TradeRequest=0x77b5
OP_TradeAcceptClick=0x69e2
OP_TradeRequestAck=0x14bf
OP_TradeCoins=0x4206
OP_FinishTrade=0x3993
OP_CancelTrade=0x354c
OP_TradeMoneyUpdate=0x68c2
OP_MoneyUpdate=0x640c
OP_TradeBusy=0x5505
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x7349
OP_FinishWindow2=0x40ef
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x189c
OP_ItemVerifyReply=0x097b
# merchant stuff
OP_ShopPlayerSell=0x0000
OP_ShopRequest=0x4fed
OP_ShopEnd=0x30a8
OP_ShopEndConfirm=0x3196
OP_ShopPlayerBuy=0x0ddd
OP_ShopDelItem=0x724f
# tradeskill stuff:
OP_ClickObject=0x4aa1
OP_ClickObjectAction=0x0c1e
OP_ClearObject=0x7a11
OP_RecipeDetails=0x40d7
OP_RecipesFavorite=0x71b1
OP_RecipesSearch=0x1db6
OP_RecipeReply=0x6e02
OP_RecipeAutoCombine=0x6261
OP_TradeSkillCombine=0x579a
# Tribute Packets:
OP_OpenGuildTributeMaster=0x378d
OP_OpenTributeMaster=0x7666
OP_SelectTribute=0x79fc
OP_TributeItem=0x4f3e
OP_TributeMoney=0x58fb
OP_TributeToggle=0x241d
OP_TributePointUpdate=0x5300
OP_TributeNPC=0x0000
OP_GuildTributeInfo=0x0000
OP_OpenTributeReply=0x0000
OP_GuildTributeStatus=0x0000
# Adventure packets:
OP_LeaveAdventure=0x5d18
OP_AdventureFinish=0x400f
OP_AdventureInfoRequest=0x3cb0
OP_AdventureInfo=0x4c54
OP_AdventureRequest=0x2c6c
OP_AdventureDetails=0x5648
OP_AdventureData=0x7171
OP_AdventureUpdate=0x1b01
OP_AdventureMerchantRequest=0x6922
OP_AdventureMerchantResponse=0x3e47
OP_AdventureMerchantPurchase=0x5b72
OP_AdventureMerchantSell=0x2f9b
OP_AdventurePointsUpdate=0x65c3
OP_AdventureStatsRequest=0x5a62
OP_AdventureStatsReply=0x2370
OP_AdventureLeaderboardRequest=0x7093
OP_AdventureLeaderboardReply=0x7f79
# Group Opcodes
OP_GroupDisband=0x4c10
OP_GroupInvite=0x6110
OP_GroupFollow=0x1649
OP_GroupUpdate=0x3abb
OP_GroupUpdateB=0x6194
OP_GroupCancelInvite=0x0000
OP_GroupAcknowledge=0x7323
OP_GroupDelete=0x0f6c
OP_CancelInvite=0x2a50
OP_GroupFollow2=0x2060
OP_GroupInvite2=0x32c2
OP_GroupDisbandYou=0x1ae5
OP_GroupDisbandOther=0x74da
OP_GroupLeaderChange=0x21b4
OP_GroupRoles=0x70e2
OP_GroupMakeLeader=0x4229
OP_DoGroupLeadershipAbility=0x1fb5
OP_GroupLeadershipAAUpdate=0x02cf
OP_GroupMentor=0x3342
OP_InspectBuffs=0x486c
# LFG/LFP Opcodes
OP_LFGCommand=0x6060
OP_LFGGetMatchesRequest=0x0340
OP_LFGGetMatchesResponse=0x5048
OP_LFPGetMatchesRequest=0x4d7d
OP_LFPGetMatchesResponse=0x22c6
OP_LFPCommand=0x49a9
OP_LFGAppearance=0x0000
OP_LFGResponse=0x0000
# Raid Opcodes
OP_RaidInvite=0x55ac
OP_RaidUpdate=0x3973
OP_RaidJoin=0x0000
# Button-push commands
OP_Taunt=0x2703
OP_CombatAbility=0x3eba
OP_SenseTraps=0x02af
OP_PickPocket=0x39e8
OP_DisarmTraps=0x78bf
OP_Disarm=0x5ec8
OP_Sneak=0x5d55
OP_Fishing=0x1e2a
OP_InstillDoubt=0x640e
OP_FeignDeath=0x52fa
OP_Mend=0x0ecf
OP_Bind_Wound=0x0386
OP_LDoNOpen=0x3d5c
# Task packets
OP_TaskDescription=0x3714
OP_TaskActivity=0x08d3
OP_CompletedTasks=0x4eba
OP_TaskActivityComplete=0x5e19
OP_AcceptNewTask=0x0a23
OP_CancelTask=0x39f0
OP_TaskMemberList=0x5727
OP_OpenNewTasksWindow=0x48a2
OP_AvaliableTask=0x36e8
OP_TaskHistoryRequest=0x5f1c
OP_TaskHistoryReply=0x3d05
OP_DeclineAllTasks=0x0000
# Title opcodes
OP_NewTitlesAvailable=0x0d32
OP_RequestTitles=0x6344
OP_SendTitleList=0x2d08
OP_SetTitle=0x6527
OP_SetTitleReply=0x4c21
# mail opcodes
OP_Command=0x0000
OP_MailboxHeader=0x0000
OP_MailHeader=0x0000
OP_MailBody=0x0000
OP_NewMail=0x0000
OP_SentConfirm=0x0000
########### Below this point should not be needed ###########
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000
OP_LocInfo=0x0000
OP_ReloadUI=0x0000
OP_ItemName=0x0000
OP_ItemLinkText=0x0000
OP_MultiLineMsg=0x0000
OP_MendHPUpdate=0x0000
OP_TargetReject=0x0000
OP_SafePoint=0x0000
OP_ApproveZone=0x0000
OP_ZoneComplete=0x0000
OP_ClientError=0x0000
OP_DumpName=0x0000
OP_Heartbeat=0x0000
OP_CrashDump=0x0000
OP_LoginComplete=0x0000
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000
OP_PlayMP3=0x5770
OP_ReclaimCrystals=0x0000
OP_DynamicWall=0x0000
OP_OpenDiscordMerchant=0x0000
OP_DiscordMerchantInventory=0x0000
OP_GiveMoney=0x0000
OP_RequestKnowledgeBase=0x0000
OP_KnowledgeBase=0x0000
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000
OP_Some6ByteHPUpdate=0x0000 seems to happen when you target group members
OP_QueryResponseThing=0x0000
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x46d3 # OP_SendSpellChecksum
#OP_LoginUnknown2=0x040b # OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 search term for petition
OP_PetitionSearchResults=0x0000 (list of?) matches from search
OP_PetitionSearchText=0x0000 text results of search
OP_PetitionUpdate=0x0000
OP_PetitionCheckout=0x0000
OP_PetitionCheckIn=0x0000
OP_PetitionQue=0x0000
OP_PetitionUnCheckout=0x0000
OP_PetitionDelete=0x0000
OP_DeletePetition=0x0000
OP_PetitionResolve=0x0000
OP_PDeletePetition=0x0000
OP_PetitionBug=0x0000
OP_PetitionRefresh=0x0000
OP_PetitionCheckout2=0x0000
OP_PetitionViewPetition=0x0000
# Login opcodes
OP_SessionReady=0x0000
OP_Login=0x0000
OP_ServerListRequest=0x0000
OP_PlayEverquestRequest=0x0000
OP_PlayEverquestResponse=0x0000
OP_ChatMessage=0x0000
OP_LoginAccepted=0x0000
OP_ServerListResponse=0x0000
OP_Poll=0x0000
OP_EnterChat=0x0000
OP_PollResponse=0x0000
# raw opcodes
OP_RAWSessionRequest=0x0000
OP_RAWSessionResponse=0x0000
OP_RAWCombined=0x0000
OP_RAWSessionDisconnect=0x0000
OP_RAWKeepAlive=0x0000
OP_RAWSessionStatRequest=0x0000
OP_RAWSessionStatResponse=0x0000
OP_RAWPacket=0x0000
OP_RAWFragment=0x0000
OP_RAWOutOfOrderAck=0x0000
OP_RAWAck=0x0000
OP_RAWAppCombined=0x0000
OP_RAWOutOfSession=0x0000
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000
+660
View File
@@ -0,0 +1,660 @@
# ShowEQ Import Notes:
# ZERO THE FILE first
# perl -pi -e 's/0x[0-9a-fA-F]{4}/0x0000/g' opcodes.conf
# Unknown Mapping:
# OP_Action2 -> OP_Damage
# OP_EnvDamage -> OP_Damage ---> might have been a one time mistake
# Name Differences:
# OP_CancelInvite -> OP_GroupCancelInvite
# OP_GMFind -> OP_FindPersonRequest
# OP_CommonMessage -> OP_ChannelMessage
OP_Unknown=0x0000
OP_ExploreUnknown=0x0000 # used for unknown explorer
# world packets
# Required to reach Char Select:
OP_SendLoginInfo=0x7a09
OP_ApproveWorld=0x7499
OP_LogServer=0x7ceb
OP_SendCharInfo=0x00d2
OP_ExpansionInfo=0x590d
OP_GuildsList=0x0000
OP_EnterWorld=0x578f
OP_PostEnterWorld=0x6259
OP_World_Client_CRC1=0x12cc
OP_World_Client_CRC2=0x0f13
OP_SendSpellChecksum=0x0000
OP_SendSkillCapsChecksum=0x0000
# Character Select Related:
OP_SendMaxCharacters=0x5475
OP_SendMembership=0x7acc
OP_SendMembershipDetails=0x057b
OP_CharacterCreateRequest=0x6773
OP_CharacterCreate=0x6bbf
OP_DeleteCharacter=0x1808
OP_RandomNameGenerator=0x5954
OP_ApproveName=0x56a2
OP_MOTD=0x0c22
OP_SetChatServer=0x1bc5
OP_SetChatServer2=0x7eec
OP_ZoneServerInfo=0x4c44
OP_WorldComplete=0x4493
OP_WorldUnknown001=0x2301
OP_FloatListThing=0x46c6
# Reasons for Disconnect:
OP_ZoneUnavail=0x4cb4
OP_WorldClientReady=0x23c1
OP_CharacterStillInZone=0x0000
OP_WorldChecksumFailure=0x0000
OP_WorldLoginFailed=0x0000
OP_WorldLogout=0x0000
OP_WorldLevelTooHigh=0x0000
OP_CharInacessable=0x0000
OP_UserCompInfo=0x0000
OP_SendExeChecksum=0x0000
OP_SendBaseDataChecksum=0x0000
# Zone in opcodes
OP_AckPacket=0x471d
OP_ZoneEntry=0x5089
OP_ReqNewZone=0x7887
OP_NewZone=0x1795
OP_ZoneSpawns=0x5237
OP_PlayerProfile=0x6506
OP_TimeOfDay=0x5070
OP_LevelUpdate=0x1eec
OP_Stamina=0x2a79
OP_RequestClientZoneChange=0x3fcf
OP_ZoneChange=0x2d18
OP_LockoutTimerInfo=0x0000
OP_ZoneServerReady=0x0000
OP_ZoneInUnknown=0x0000
OP_LogoutReply=0x0000
OP_PreLogoutReply=0x0000
# Required to fully log in
OP_SpawnAppearance=0x0971
OP_ChangeSize=0x4707
OP_TributeUpdate=0x5961
OP_TributeTimer=0x073d
OP_SendTributes=0x729b
OP_SendGuildTributes=0x1877
OP_TributeInfo=0x4254
OP_Weather=0x661e
OP_ReqClientSpawn=0x35fa
OP_SpawnDoor=0x7291
OP_GroundSpawn=0x6fca
OP_SendZonepoints=0x69a4
OP_BlockedBuffs=0x3033
OP_RemoveBlockedBuffs=0x0de7
OP_ClearBlockedBuffs=0x34cb
OP_WorldObjectsSent=0x5ae2
OP_SendExpZonein=0x5f8e
OP_SendAATable=0x66b5
OP_RespondAA=0x7a27
OP_UpdateAA=0x66f0
OP_SendAAStats=0x43c8
OP_AAExpUpdate=0x7d14
OP_ExpUpdate=0x20ed
OP_HPUpdate=0x2828
OP_ManaChange=0x43af
OP_TGB=0x0876
OP_SpecialMesg=0x0083
OP_GuildMemberList=0x12a6
OP_GuildMOTD=0x3e13
OP_CharInventory=0x5ca6
OP_WearChange=0x7994
OP_ClientUpdate=0x7dfc
OP_ClientReady=0x345d
OP_SetServerFilter=0x444d
# Guild Opcodes - Disabled until crashes are resolved in RoF
OP_GetGuildMOTD=0x36e0
OP_GetGuildMOTDReply=0x4f1f
OP_GuildMemberUpdate=0x69b9
OP_GuildInvite=0x7099
OP_GuildRemove=0x1444
OP_GuildPeace=0x67e3
OP_SetGuildMOTD=0x0b0b
OP_GuildList=0x507a
OP_GuildWar=0x1ffb
OP_GuildLeader=0x7e09
OP_GuildDelete=0x3708
OP_GuildInviteAccept=0x7053
OP_GuildDemote=0x2d4e
OP_GuildPromote=0x0000
OP_GuildPublicNote=0x5053
OP_GuildManageBanker=0x748f
OP_GuildBank=0x5134
OP_SetGuildRank=0x0b9c
OP_GuildUpdateURLAndChannel=0x2958
OP_GuildStatus=0x7326
OP_GuildCreate=0x1dc8
OP_GuildMemberLevelUpdate=0x0000 # Unused?
OP_ZoneGuildList=0x0000 # Unused?
OP_GetGuildsList=0x0000 # Unused?
OP_LFGuild=0x0000
OP_GuildManageRemove=0x0000
OP_GuildManageAdd=0x0000
OP_GuildManageStatus=0x0000
# GM/Guide Opcodes
OP_GMServers=0x08c1
OP_GMBecomeNPC=0x3ae1
OP_GMZoneRequest=0x62ac
OP_GMZoneRequest2=0x7e1a
OP_GMGoto=0x7d8e
OP_GMSearchCorpse=0x357c
OP_GMHideMe=0x79c5
OP_GMDelCorpse=0x607e
OP_GMApproval=0x6db5
OP_GMToggle=0x2097
OP_GMSummon=0x486f
OP_GMEmoteZone=0x1cfd
OP_GMEmoteWorld=0x458e
OP_GMFind=0x4a8f
OP_GMKick=0x26a7
OP_GMKill=0x51d3
OP_GMNameChange=0x035f
OP_GMLastName=0x46ce
# Misc Opcodes
OP_InspectRequest=0x57bc
OP_InspectAnswer=0x71ac
OP_InspectMessageUpdate=0x4d25
OP_BeginCast=0x318f
OP_ColoredText=0x0000
OP_ConsentResponse=0x384a
OP_MemorizeSpell=0x217c
OP_SwapSpell=0x0efa
OP_CastSpell=0x1287
OP_Consider=0x742b
OP_FormattedMessage=0x1024
OP_SimpleMessage=0x213f
OP_Buff=0x659c
OP_Illusion=0x312a
OP_MoneyOnCorpse=0x5f44
OP_RandomReply=0x106b
OP_DenyResponse=0x2382
OP_SkillUpdate=0x004c
OP_GMTrainSkillConfirm=0x66dd
OP_RandomReq=0x7b10
OP_Death=0x6517
OP_GMTraining=0x1966
OP_GMEndTraining=0x4d6b
OP_GMTrainSkill=0x2a85
OP_Animation=0x7177
OP_Begging=0x6703
OP_Consent=0x1fd1
OP_ConsentDeny=0x7a45
OP_AutoFire=0x241e
OP_PetCommands=0x0159
OP_DeleteSpell=0x52e5
OP_Surname=0x0423
OP_ClearSurname=0x7d23
OP_FaceChange=0x5578
OP_SenseHeading=0x260a
OP_Action=0x744c
OP_ConsiderCorpse=0x5204
OP_HideCorpse=0x49e1
OP_CorpseDrag=0x0904
OP_CorpseDrop=0x7037
OP_Bug=0x73f4
OP_Feedback=0x5602
OP_Report=0x1414
OP_Damage=0x6f15
OP_ChannelMessage=0x2b2d
OP_Assist=0x4478
OP_AssistGroup=0x27f8
OP_MoveCoin=0x0bcf
OP_ZonePlayerToBind=0x0ecb
OP_KeyRing=0x6857
OP_WhoAllRequest=0x65ab
OP_WhoAllResponse=0x7c88
OP_FriendsWho=0x3956
OP_ConfirmDelete=0x43a3
OP_Logout=0x4ac6
OP_Rewind=0x1745
OP_TargetCommand=0x58e2
OP_Hide=0x67fe
OP_Jump=0x2060
OP_Camp=0x28ec
OP_Emote=0x373b
OP_SetRunMode=0x009f
OP_BankerChange=0x383c
OP_TargetMouse=0x075d
OP_MobHealth=0x37b1
OP_InitialMobHealth=0x0000 # Unused?
OP_TargetHoTT=0x0272
OP_XTargetResponse=0x672f
OP_XTargetRequest=0x45be
OP_XTargetAutoAddHaters=0x792c
OP_TargetBuffs=0x4f4b
OP_BuffCreate=0x3377
OP_BuffRemoveRequest=0x64f2
OP_DeleteSpawn=0x7280
OP_AutoAttack=0x109d
OP_AutoAttack2=0x3526
OP_Consume=0x4b70
OP_MoveItem=0x32ee
OP_DeleteItem=0x18ad
OP_DeleteCharge=0x01b8
OP_ItemPacket=0x368e
OP_ItemLinkResponse=0x633c
OP_ItemLinkClick=0x4cef
OP_ItemPreview=0x6b5c
OP_NewSpawn=0x6097
OP_Track=0x17e5
OP_TrackTarget=0x0029
OP_TrackUnknown=0x4577
OP_ClickDoor=0x3a8f
OP_MoveDoor=0x08e8
OP_RemoveAllDoors=0x700c
OP_EnvDamage=0x51fd
OP_BoardBoat=0x4211
OP_Forage=0x5306
OP_LeaveBoat=0x7617
OP_ControlBoat=0x0ae7
OP_SafeFallSuccess=0x2219
OP_RezzComplete=0x760d
OP_RezzRequest=0x3c21
OP_RezzAnswer=0x701c
OP_Shielding=0x48c1
OP_RequestDuel=0x3af1
OP_MobRename=0x2c57
OP_AugmentItem=0x661b
OP_WeaponEquip1=0x34a7
OP_WeaponEquip2=0x559a
OP_WeaponUnequip2=0x2d25
OP_ApplyPoison=0x31e6
OP_Save=0x4a39
OP_TestBuff=0x7cb8
OP_CustomTitles=0x100e
OP_Split=0x3a54
OP_YellForHelp=0x4e56
OP_LoadSpellSet=0x261d
OP_Bandolier=0x7677
OP_PotionBelt=0x1a3e
OP_DuelResponse=0x6a46
OP_DuelResponse2=0x68d3
OP_SaveOnZoneReq=0x600d
OP_ReadBook=0x72df
OP_Dye=0x23b9
OP_InterruptCast=0x048c
OP_AAAction=0x424e
OP_LeadershipExpToggle=0x6c55
OP_LeadershipExpUpdate=0x2797
OP_PurchaseLeadershipAA=0x0026
OP_UpdateLeadershipAA=0x026
OP_MarkNPC=0x5a58
OP_MarkRaidNPC=0x74bd #unimplemented
OP_ClearNPCMarks=0x2003
OP_ClearRaidNPCMarks=0x20d3 #unimplemented
OP_DelegateAbility=0x76b8
OP_SetGroupTarget=0x2814
OP_Charm=0x5d92
OP_Stun=0x36a4
OP_SendFindableNPCs=0x3897
OP_FindPersonRequest=0x5cea
OP_FindPersonReply=0x7e58
OP_Sound=0x1a30
OP_PetBuffWindow=0x5882
OP_LevelAppearance=0x3bc9
OP_Translocate=0x6580
OP_Sacrifice=0x1821
OP_PopupResponse=0x214a
OP_OnLevelMessage=0x4fd0
OP_AugmentInfo=0x0afb
OP_Petition=0x5f03
OP_SomeItemPacketMaybe=0x747c
OP_PVPStats=0x6f4b
OP_PVPLeaderBoardRequest=0x3707
OP_PVPLeaderBoardReply=0x25b7
OP_PVPLeaderBoardDetailsRequest=0x15a9
OP_PVPLeaderBoardDetailsReply=0x04aa
OP_RestState=0x00f
OP_RespawnWindow=0x28bc
OP_LDoNButton=0x5327
OP_SetStartCity=0x6326
OP_VoiceMacroIn=0x17fd
OP_VoiceMacroOut=0x409a
OP_ItemViewUnknown=0x2289
OP_VetRewardsAvaliable=0x590e
OP_VetClaimRequest=0x1126
OP_VetClaimReply=0x16d4
OP_DisciplineUpdate=0x759e
OP_DisciplineTimer=0x6989
OP_BecomeCorpse=0x0000 # Unused?
OP_Action2=0x0000 # Unused?
OP_MobUpdate=0x2c84
OP_NPCMoveUpdate=0x189c
OP_CameraEffect=0x127f
OP_SpellEffect=0x5936
OP_RemoveNimbusEffect=0xc693
OP_AltCurrency=0x7121
OP_AltCurrencyMerchantRequest=0x6b6d
OP_AltCurrencyMerchantReply=0x74ec
OP_AltCurrencyPurchase=0x61cb
OP_AltCurrencySell=0x0165
OP_AltCurrencySellSelection=0x5409
OP_AltCurrencyReclaim=0x532a
OP_CrystalCountUpdate=0x467f
OP_CrystalCreate=0x7aee
OP_CrystalReclaim=0x2439
OP_Untargetable=0x053c
OP_IncreaseStats=0x70a3
OP_Weblink=0x18d3
OP_OpenContainer=0x0000
OP_Marquee=0x0000
OP_ItemRecastDelay=0x08a6
#OP_OpenInventory=0x0000 # Likely does not exist in RoF -U
OP_DzQuit=0xb2e3
OP_DzListTimers=0x7b68
OP_DzAddPlayer=0x4701
OP_DzRemovePlayer=0x1abc
OP_DzSwapPlayer=0x405b
OP_DzMakeLeader=0x543d
OP_DzPlayerList=0x14c6
OP_DzJoinExpeditionConfirm=0x7f4b
OP_DzJoinExpeditionReply=0x1950
OP_DzExpeditionInfo=0x9119
OP_DzExpeditionList=0x205f
OP_DzMemberStatus=0x32f0
OP_DzLeaderStatus=0x3de9
OP_DzExpeditionEndsWarning=0x5189
OP_DzMemberList=0x5ae4
OP_DzCompass=0x3e0e
OP_DzChooseZone=0x0000
# New Opcodes
OP_SpawnPositionUpdate=0x0000 # Actually OP_MobUpdate ?
OP_ManaUpdate=0x3791
OP_EnduranceUpdate=0x5f42
OP_MobManaUpdate=0x2404
OP_MobEnduranceUpdate=0x1c81
# Mercenary Opcodes
OP_MercenaryDataUpdateRequest=0x7b89
OP_MercenaryDataUpdate=0x61a4
OP_MercenaryDataRequest=0x11c1
OP_MercenaryDataResponse=0x72ce
OP_MercenaryHire=0x7169
OP_MercenaryDismiss=0x6e83
OP_MercenaryTimerRequest=0x31e4
OP_MercenaryTimer=0x0763
OP_MercenaryUnknown1=0x5d26
OP_MercenaryCommand=0x27f2
OP_MercenarySuspendRequest=0x4407
OP_MercenarySuspendResponse=0x6f03
OP_MercenaryUnsuspendResponse=0x27a0
# Looting
OP_LootRequest=0x0adf
OP_EndLootRequest=0x30f7
OP_LootItem=0x4dc9
OP_LootComplete=0x55c4
# bazaar trader stuff:
OP_BazaarSearch=0x39d6
OP_TraderDelItem=0x0000
OP_BecomeTrader=0x61b3
OP_TraderShop=0x31df
OP_Trader=0x4ef5
OP_TraderBuy=0x0000
OP_Barter=0x243a
OP_ShopItem=0x0000
OP_BazaarInspect=0x0000
OP_Bazaar=0x0000
OP_TraderItemUpdate=0x0000
# pc/npc trading
OP_TradeRequest=0x77b5
OP_TradeAcceptClick=0x69e2
OP_TradeRequestAck=0x14bf
OP_TradeCoins=0x4206
OP_FinishTrade=0x3993
OP_CancelTrade=0x354c
OP_TradeMoneyUpdate=0x68c2
OP_MoneyUpdate=0x640c
OP_TradeBusy=0x5505
# Sent after canceling trade or after closing tradeskill object
OP_FinishWindow=0x7349
OP_FinishWindow2=0x40ef
# Sent on Live for what seems to be item existance verification
# Ex. Before Right Click Effect happens from items
OP_ItemVerifyRequest=0x097b
OP_ItemVerifyReply=0x2115
# merchant stuff
OP_ShopPlayerSell=0x1901
OP_ShopRequest=0x4fed
OP_ShopEnd=0x30a8
OP_ShopEndConfirm=0x3196
OP_ShopPlayerBuy=0x04c
OP_ShopDelItem=0x724f
# tradeskill stuff:
OP_ClickObject=0x4aa1
OP_ClickObjectAction=0x0c1e
OP_ClearObject=0x7a11
OP_RecipeDetails=0x40d7
OP_RecipesFavorite=0x5c74
OP_RecipesSearch=0x1db6
OP_RecipeReply=0x6e02
OP_RecipeAutoCombine=0x6261
OP_TradeSkillCombine=0x579a
# Tribute Packets:
OP_OpenGuildTributeMaster=0x378d
OP_OpenTributeMaster=0x7666
OP_SelectTribute=0x79fc
OP_TributeItem=0x4f3e
OP_TributeMoney=0x58fb
OP_TributeToggle=0x241d
OP_TributePointUpdate=0x5300
OP_TributeNPC=0x0000
OP_GuildTributeInfo=0x0000
OP_OpenTributeReply=0x0000
OP_GuildTributeStatus=0x0000
# Adventure packets:
OP_LeaveAdventure=0x5d18
OP_AdventureFinish=0x400f
OP_AdventureInfoRequest=0x3cb0
OP_AdventureInfo=0x4c54
OP_AdventureRequest=0x2c6c
OP_AdventureDetails=0x5648
OP_AdventureData=0x7171
OP_AdventureUpdate=0x1b01
OP_AdventureMerchantRequest=0x6922
OP_AdventureMerchantResponse=0x3e47
OP_AdventureMerchantPurchase=0x5b72
OP_AdventureMerchantSell=0x2f9b
OP_AdventurePointsUpdate=0x65c3
OP_AdventureStatsRequest=0x5a62
OP_AdventureStatsReply=0x2370
OP_AdventureLeaderboardRequest=0x7093
OP_AdventureLeaderboardReply=0x7f79
# Group Opcodes
OP_GroupDisband=0x4c10
OP_GroupInvite=0x1649
OP_GroupFollow=0x05ce
OP_GroupUpdate=0x3abb
OP_GroupUpdateB=0x6194
OP_GroupCancelInvite=0x0000
OP_GroupAcknowledge=0x7323
OP_GroupDelete=0x0f6c
OP_CancelInvite=0x32c2
OP_GroupFollow2=0x2a50
OP_GroupInvite2=0x6c65
OP_GroupDisbandYou=0x1ae5
OP_GroupDisbandOther=0x74da
OP_GroupLeaderChange=0x21b4
OP_GroupRoles=0x70e2
OP_GroupMakeLeader=0x4229
OP_DoGroupLeadershipAbility=0x1fb5
OP_GroupLeadershipAAUpdate=0x02cf
OP_GroupMentor=0x5892
OP_InspectBuffs=0x486c
# LFG/LFP Opcodes
OP_LFGCommand=0x6060
OP_LFGGetMatchesRequest=0x0340
OP_LFGGetMatchesResponse=0x5048
OP_LFPGetMatchesRequest=0x4d7d
OP_LFPGetMatchesResponse=0x22c6
OP_LFPCommand=0x49a9
OP_LFGAppearance=0x0000
OP_LFGResponse=0x0000
# Raid Opcodes
OP_RaidInvite=0x55ac
OP_RaidUpdate=0x3973
OP_RaidJoin=0x0000
# Button-push commands
OP_Taunt=0x2703
OP_CombatAbility=0x3eba
OP_SenseTraps=0x02af
OP_PickPocket=0x39e8
OP_DisarmTraps=0x78bf
OP_Disarm=0x5ec8
OP_Sneak=0x5d55
OP_Fishing=0x1e2a
OP_InstillDoubt=0x640e
OP_FeignDeath=0x52fa
OP_Mend=0x0ecf
OP_Bind_Wound=0x0386
OP_LDoNOpen=0x3d5c
# Task packets
OP_TaskDescription=0x083
OP_TaskActivity=0x3714
OP_CompletedTasks=0x4eba
OP_TaskActivityComplete=0x5e19
OP_AcceptNewTask=0x0a23
OP_CancelTask=0x08d3
OP_TaskMemberList=0x5727
OP_OpenNewTasksWindow=0x48a2
OP_AvaliableTask=0x36e8
OP_TaskHistoryRequest=0x5f1c
OP_TaskHistoryReply=0x3d05
OP_DeclineAllTasks=0x0000
# Title opcodes
OP_NewTitlesAvailable=0x0d32
OP_RequestTitles=0x6344
OP_SendTitleList=0x2d08
OP_SetTitle=0x6527
OP_SetTitleReply=0x4c21
# mail opcodes
OP_Command=0x0000
OP_MailboxHeader=0x0000
OP_MailHeader=0x0000
OP_MailBody=0x0000
OP_NewMail=0x0000
OP_SentConfirm=0x0000
########### Below this point should not be needed ###########
# This section are all unknown in Titanium
OP_ForceFindPerson=0x0000
OP_LocInfo=0x0000
OP_ReloadUI=0x0000
OP_ItemName=0x0000
OP_ItemLinkText=0x0000
OP_MultiLineMsg=0x0000
OP_MendHPUpdate=0x0000
OP_TargetReject=0x0000
OP_SafePoint=0x0000
OP_ApproveZone=0x0000
OP_ZoneComplete=0x0000
OP_ClientError=0x0000
OP_DumpName=0x0000
OP_Heartbeat=0x0000
OP_CrashDump=0x0000
OP_LoginComplete=0x0000
# discovered opcodes not yet used:
OP_PickLockSuccess=0x0000
OP_PlayMP3=0x0000
OP_ReclaimCrystals=0x0000
OP_DynamicWall=0x0000
OP_OpenDiscordMerchant=0x0000
OP_DiscordMerchantInventory=0x0000
OP_GiveMoney=0x0000
OP_RequestKnowledgeBase=0x0000
OP_KnowledgeBase=0x0000
OP_SlashAdventure=0x0000 # /adventure
OP_BecomePVPPrompt=0x0000
OP_MoveLogRequest=0x0000 # gone I think
OP_MoveLogDisregard=0x0000 # gone I think
# named unknowns, to make looking for real unknown easier
OP_AnnoyingZoneUnknown=0x0000
OP_Some6ByteHPUpdate=0x0000 seems to happen when you target group members
OP_QueryResponseThing=0x0000
# realityincarnate: these are just here to stop annoying several thousand byte packet dumps
#OP_LoginUnknown1=0x46d3 # OP_SendSpellChecksum
#OP_LoginUnknown2=0x040b # OP_SendSkillCapsChecksum
# Petition Opcodes
OP_PetitionSearch=0x0000 search term for petition
OP_PetitionSearchResults=0x0000 (list of?) matches from search
OP_PetitionSearchText=0x0000 text results of search
OP_PetitionUpdate=0x0000
OP_PetitionCheckout=0x0000
OP_PetitionCheckIn=0x0000
OP_PetitionQue=0x0000
OP_PetitionUnCheckout=0x0000
OP_PetitionDelete=0x0000
OP_DeletePetition=0x0000
OP_PetitionResolve=0x0000
OP_PDeletePetition=0x0000
OP_PetitionBug=0x0000
OP_PetitionRefresh=0x0000
OP_PetitionCheckout2=0x0000
OP_PetitionViewPetition=0x0000
# Login opcodes
OP_SessionReady=0x0000
OP_Login=0x0000
OP_ServerListRequest=0x0000
OP_PlayEverquestRequest=0x0000
OP_PlayEverquestResponse=0x0000
OP_ChatMessage=0x0000
OP_LoginAccepted=0x0000
OP_ServerListResponse=0x0000
OP_Poll=0x0000
OP_EnterChat=0x0000
OP_PollResponse=0x0000
# raw opcodes
OP_RAWSessionRequest=0x0000
OP_RAWSessionResponse=0x0000
OP_RAWCombined=0x0000
OP_RAWSessionDisconnect=0x0000
OP_RAWKeepAlive=0x0000
OP_RAWSessionStatRequest=0x0000
OP_RAWSessionStatResponse=0x0000
OP_RAWPacket=0x0000
OP_RAWFragment=0x0000
OP_RAWOutOfOrderAck=0x0000
OP_RAWAck=0x0000
OP_RAWAppCombined=0x0000
OP_RAWOutOfSession=0x0000
# we need to document the differences between these packets to make identifying them easier
OP_Some3ByteHPUpdate=0x0000 # initial HP update for mobs
OP_InitialHPUpdate=0x0000
+39
View File
@@ -0,0 +1,39 @@
opendir my $dir, "logs" or die "Cannot open directory: $!";
my @files = readdir $dir;
closedir $dir;
$inc = 0;
foreach my $val (@files){
if($val=~/crash_zone/i){
$stl = 0;
$crash[$inc] = "";
my $file = "logs/" . $val;
open my $info, $file or die "Could not open $file: $!";
while( my $line = <$info>) {
if($line=~/CRTStartup/i){ $stl = 0; }
@data = split(']', $line);
if($stl == 1){ $crash[$inc] .= $data[1]; }
if($line=~/dbghelp.dll/i){ $stl = 1; }
}
close $info;
$inc++;
}
}
#::: Count Crash Occurrence first
$i = 0;
while($crash[$i]){
$crash_count[length($crash[$i])]++;
$unique_crash[length($crash[$i])] = $crash[$i];
$i++;
}
$i = 0;
while($crash[$i]){
if($unique_crash_tracker[length($crash[$i])] != 1){
print "Crash Occurrence " . $crash_count[length($crash[$i])] . " Time(s) Length (" . length($crash[$i]) . ") \n\n";
print $crash[$i] . "\n";
print "=========================================\n";
}
$unique_crash_tracker[length($crash[$i])] = 1;
$i++;
}
+351
View File
@@ -0,0 +1,351 @@
5001|1_task_system.sql
# 5002|2_optional_maxclients.sql
# 5003|14_optional_merchantlist.sql
5004|35_task_stepped.sql
5005|42_task_min_maxlevel.sql
5006|55_zone_shutdowndeleay.sql
# 5007|68_optional_character_maxexplevel.sql
# 5008|103_optional_chat_rules.sql
5009|104_traps.sql
# 5010|106_optional_proc_rules.sql
5011|120_damageshieldtypes.sql
5012|125_aggrozone.sql
# 5013|127_optional_spell_rules.sql
# 5014|129_optional_shared_plat_rule.sql
# 5015|131_optional_combat_rules.sql
5016|133_task_repeatable.sql
5017|142_deathpeace_and_lifetap_aas.sql
# 5018|158_optional_death_exp_loss.sql
5019|176_melody.sql
5020|189_character_.sql
5021|196_trader.sql
5022|210_undyeme.sql
5023|222_buyer.sql
5024|226_account_limiting.sql
5025|230_spells_table.sql
5026|235_horses_table.sql
5027|243_spawn_timers.sql
5028|247_mail.sql
5029|249_chatchannels.sql
5030|250_bot_spell_update.sql
# 5031|250_optional_bot_spell_update.sql
# 5032|285_optional_bot_spell_update.sql
5033|292_augslots.sql
5034|294_merchant_logging.sql
5035|304_faction_list.sql
5036|326_aas.sql
5037|328_bot_management.sql
# 5038|328_optional_bot_management.sql
5039|340_gm_ips.sql
5040|356_combat.sql
5041|360_peqzone.sql
5042|364_ranged_dist_rule.sql
5043|386_bot_save_raid.sql
# 5044|434_optional_rest_state_rules.sql
5045|447_sof_startzone_rule.sql
5046|463_altadv_vars.sql
5047|475_aa_actions.sql
5048|500_spawn2_optimization.sql
5049|503_bugs.sql
5050|518_drakkin_npc_type_features.sql
5051|524_rule_values_notes.sql
5052|527_npc_armor_tint.sql
5053|553_saylink_table.sql
5054|564_nokeyring.sql
5055|600_group_leadership.sql
5056|612_instance_changes.sql
5057|615_adventure_assassination.sql
5058|619_Adventure_Recruiter_Flavor.sql
5059|621_LDoNTraps.sql
5060|633_ucs.sql
5061|634_TrapTemplateDefaultValue.sql
5062|643_BotsTable.sql
5063|646_archery_penalty_rule.sql
5064|665_heroic_resists.sql
5065|667_titles.sql
5066|687_aa_table_changes.sql
5067|699_peqzone_rule.sql
5068|702_aashieldblock_tint_table.sql
5069|703_peqzone_rule.sql
5070|704_rules.sql
5071|710_tint_set_naming.sql
5072|721_pathing_rules.sql
5073|730_smart_delay_moving.sql
5074|731_rule_assist_notarget_self.sql
5075|732_sacrifice_rules.sql
5076|745_slow_mitigation.sql
5077|754_archery_base_damage_rule.sql
5078|755_sof_altadv_vars_updates.sql
5079|773_monk_rules.sql
# 5080|853_optional_rule_aaexp.sql
# 5081|858_optional_rule_ip_limit_by_status.sql
# 5082|892_optional_bots_table_mod.sql
# 5083|893_optional_bots_table_mod.sql
5084|898_npc_maxlevel_scalerate.sql
# 5085|902_optional_rule_snareflee.sql
5086|923_spawn2_enabled.sql
5087|962_hot_zone.sql
5088|964_reports.sql
5089|971_veteran_rewards.sql
5090|977_raid_npc_private_corpses.sql
5091|979_unique_spawn_by_name.sql
5092|980_account_ip.sql
5093|1022_botadventuring.sql
5094|1027_botactives.sql
5095|1030_botzoningsupport.sql
5096|1036_botbuffs.sql
5097|1038_botpetstatepersists.sql
5098|1038_grouptablesuniquecolumndefinitions.sql
5099|1039_botguilds.sql
5100|1040_DeprecatedBotRaidsSystems.sql
5101|1057_titles.sql
5102|1077_botgroups.sql
5103|1136_spell_globals.sql
# 5104|1144_optional_rule_return_nodrop.sql
5105|1195_account_suspendeduntil.sql
5106|1259_npc_skill_types.sql
5107|1280_bot_augs.sql
# 5108|1290_optional_exp_loss_rule.sql
5109|1293_guild_bank.sql
5110|1379_loginserver_trusted_server.sql
5111|1392_recipe_learning.sql
# 5112|1394_optional_rule_sod_hp_mana_end.sql
5113|1404_faction_list.sql
# 5114|1410_optional_sod_aas_ht_and_loh.sql
5115|1436_login_server_table_fix.sql
5116|1446_allowrest_optional.sql
5117|1446_allowrest_required.sql
5118|1450_cvs.sql
5119|1451_guilds.sql
5120|1498_instance_adventure.sql
5121|1510_global_instances.sql
5122|1511_map_path_loading.sql
5123|1513_zone_points.sql
5124|1519_zone_primary_key_id.sql
5125|1542_items_table_cleanup.sql
5126|1548_nimbuseffect_required.sql
5127|1562_instanced_spawnconditions.sql
5128|1586_waypoints_optional.sql
5129|1610_tradeskill_required.sql
5130|1618_zone.sql
# 5131|1625_optional_rule_class_race_exp_bonus.sql
# 5132|1672_optional_rules_respawn_window.sql
# 5133|1679_optional_rules_blocked_buffs.sql
5134|1696_modify_zone_and_object_tables.sql
5135|1711_account_restricted_aa.sql
# 5136|1717_optional_rule_bash_stun_chance.sql
# 5137|1718_optional_rules_mod3s.sql
# 5138|1719_optional_triggerOnCastAAs.sql
# 5139|1720_optional_sql_AAs.sql
5140|1720_required_sql_AA_effects_update.sql
# 5141|1721_optional_sql_drakkin_breath_update.sql
5142|1721_required_sql_altadv_vars_update.sql
# 5143|1723_optional_sql_new_stats_window_rule.sql
5144|1723_required_sql_corruption.sql
# 5145|1736_optional_sql_feral_swipe.sql
5146|1737_required_sql_rule_and_aa_update.sql
# 5147|1746_optional_sql_bot_manaregen.sql
# 5148|1747_optional_HoT_zone_and_zonepoints.sql
# 5149|1750_optional_sql_reflect_rule.sql
# 5150|1753_optional_haste_cap_rule.sql
5151|1753_required_sql_healing_adept_aa.sql
5152|1754_required_sql_healing_adept_aa_fix.sql
5153|1755_required_sql_fear_resist_aas.sql
# 5154|1784_optional_corpsedrag_rules.sql
5155|1786_required_update_to_aas.sql
5156|1790_required_aa_required_level_cost.sql
5157|1793_resist_adjust.sql
# 5158|1799_optional_rest_regen_endurance_rule.sql
5159|1802_required_doppelganger.sql
5160|1803_required_tasks_xpreward_signed.sql
5161|1804_required_ae_melee_updates.sql
# 5162|1809_optional_rules.sql
5163|1813_required_doppelganger_npcid_change.sql
# 5164|1817_optional_npc_archery_bonus_rule.sql
# 5165|1823_optional_delay_death.sql
5166|1847_required_doors_dest_zone_size_32.sql
# 5167|1859_optional_item_casts_use_focus_rule.sql
# 5168|1884_optional_bot_spells_update.sql
# 5169|1885_optional_rules_fv_pvp_expansions.sql
# 5170|1889_optional_skill_cap_rule.sql
5171|1908_required_npc_types_definitions.sql
# 5172|1926_optional_stat_cap.sql
5173|1944_spawn2.sql
5174|1946_doors.sql
# 5175|1960_optional_console_timeout_rule.sql
# 5176|1962_optional_guild_creation_window_rules.sql
# 5177|1963_optional_rule_live_like_focuses.sql
# 5178|1968_optional_enrage_rules.sql
# 5179|1972_optional_extradmg_item_cap.sql
5180|1974_required_bot_spells_update.sql
5181|1977_underwater.sql
# 5182|1998_optional_intoxication_and_looting_rules.sql
5183|2004_charges_alt_currency.sql
# 5184|2015_optional_specialization_training_rule.sql
# 5185|2016_optional_rule_bot_aa_expansion.sql
# 5186|2023_optional_mysqlcli.sql
# 5187|2024_optional_update_crystals.sql
5188|2024_required_update.sql
5189|2057_required_discovered_items.sql
# 5190|2058_optional_rule_discovered_items.sql
5191|2062_required_version_changes.sql
5192|2069_required_pets.sql
5193|2079_player_speech.sql
5194|2087_required_bots_hp_and_mana_and_spell_updates.sql
5195|2098_required_zonepoint_version_changes.sql
5196|2099_required_discovered_items_account_status.sql
5197|2104_required_group_roles.sql
5198|2107_required_bot_stances.sql
5199|2129_required_lfguild.sql
5200|2133_required_faction_loot_despawn.sql
5201|2136_extended_targets.sql
5202|2142_emotes.sql
# 5203|2154_optional_rule_spell_procs_resists_falloff.sql
# 5204|2156_optional_charm_break_rule.sql
# 5205|2159_optional_defensiveproc_rules.sql
5206|2164_require_bots_bottimers.sql
# 5207|2171_optional_SpecialAttackACBonus_rule.sql
# 5208|2176_optional_aa_expansion_SOF_fix.sql
# 5209|2176_optional_FrenzyBonus_rule.sql
5210|2176_required_aa_updates.sql
5211|2178_required_aa_updates.sql
# 5212|2183_optional_bot_xp_rule.sql
# 5213|2185_optional_NPCFlurryChacne_rule
# 5214|2185_optional_NPCFlurryChacne_rule.sql
# 5215|2185_optional_NPCFlurryChance_rule.sql
5216|2185_required_aa_updates
5217|2185_required_aa_updates.sql
# 5218|2188_optional_miscspelleffect_rules
# 5219|2188_optional_miscspelleffect_rules.sql
5220|2188_required_aa_updates
5221|2188_required_aa_updates.sql
# 5222|2189_optional_taunt_rules
# 5223|2189_optional_taunt_rules.sql
5224|2195_required_sharedplatupdates.sql
# 5225|2208_optional_aa_stacking_rule.sql
# 5226|2208_optional_EnableSoulAbrasionAA.sql
5227|2208_required_aa_updates.sql
# 5228|2209_optional_additive_bonus_rule.sql
5229|2213_loot_changes.sql
5230|2214_faction_list_mod.sql
5231|2215_required_aa_updates.sql
# 5232|2243_optional_char_max_level_rule.sql
5233|2260_probability.sql
5234|2262_required_pet_discipline_update.sql
5235|2264_required_aa_updates.sql
5236|2268_QueryServ.sql
5237|2268_required_updates.sql
# 5238|2274_optional_rule_iplimitdisconnectall.sql
# 5239|2278_optional_rule_targetableswarmpet.sql
# 5240|2280_optional_rule_targetableswarmpet-rename.sql
5241|2283_required_npc_changes.sql
5242|2299_required_inspectmessage_fields.sql
# 5243|2300_optional_loot_changes.sql
5244|2304_QueryServ.sql
5245|2340_required_maxbuffslotspet.sql
5246|2361_QueryServ.sql
5247|2361_required_qs_rule_values.sql
5248|2370_required_aa_updates.sql
5249|2376_required_aa_updates.sql
# 5250|2380_optional_merc_data.sql
# 5251|2380_optional_merc_merchant_npctypes_update.sql
# 5252|2380_optional_merc_rules.sql
5253|2383_required_group_ismerc.sql
# 5254|2428_optional_levelbasedexpmods.sql
# 5255|2448_optional_stun_proc_aggro_rule.sql
5256|2471_required_aa_updates.sql
5257|2482_required_start_zones.sql
5258|2504_required_aa_updates.sql
8000|mercs.sql|SHOW TABLES LIKE 'merc_stats'|empty|
9000|2013_02_18_Merc_Rules_and_Tables.sql|SELECT * FROM `rule_values` WHERE `rule_name` LIKE '%Mercs:ResurrectRadius%'|empty|
9001|2013_02_25_Impr_HT_LT.sql|SHOW TABLES LIKE 'merc_inventory'|empty|
9002|2013_03_1_Merc_Rules_and_Equipment.sql|SHOW TABLES LIKE 'merc_inventory'|empty|
# 9003|2013_03_23_Escape_FadingMemories.sql
# 9004|2013_04_04_NaturesBounty.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '1230' AND `slot` = '1' AND `effectid` = '313' AND `base1` = '15' AND `base2` = '0'|empty|
9005|2013_04_08_Salvage.sql|SHOW COLUMNS FROM `tradeskill_recipe_entries` LIKE 'salvagecount'|empty|
9006|2013_05_05_Account_Flags.sql|SHOW TABLES LIKE 'account_flags'|empty|
9007|2013_05_05_Item_Tick.sql|SHOW TABLES LIKE 'item_tick'|empty|
9008|2013_07_11_NPC_Special_Abilities.sql|SHOW COLUMNS FROM `npc_types` LIKE 'special_abilities'|empty|
9009|2013_10_12_Merc_Special_Abilities.sql|SHOW COLUMNS FROM `merc_stats` LIKE 'special_abilities'|empty|
# 9010|2013_10_12_Merc_vwMercNpcTypes.sql
9011|2013_10_31_Recipe_disabling.sql|SHOW COLUMNS FROM `tradeskill_recipe` LIKE 'enabled'|empty|
9012|2013_11_07_BaseData.sql|SHOW TABLES LIKE 'base_data'|empty|
# 9013|2013_11_13_Instrument_Singing_Mastery.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '213' AND `slot` = '1' AND `effectid` = '260' AND `base1` = '2' AND `base2` = '23'|empty|
9014|2013_11_18_AssistRadius.sql|SHOW COLUMNS FROM `npc_types` LIKE 'assistradius'|empty|
9015|2013_12_26_MerchantList_Class_Required.sql|SHOW COLUMNS FROM `merchantlist` LIKE 'classes_required'|empty|
# 9016|2014_01_04_SongModCapAAs.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '571' AND `slot` = '1' AND `effectid` = '261'|empty|
9017|2014_01_08_SpellsNewAdditions.sql|SHOW COLUMNS FROM `spells_new` LIKE 'persistdeath'|empty|
9018|2014_01_09_PreservePetSize.sql|SHOW COLUMNS FROM `character_pet_info` LIKE 'size'|empty|
# 9019|2014_01_20_MezMastery.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '781' AND `slot` = '1' AND `effectid` = '287'|empty|
9020|2014_01_20_Not_Extendable.sql|SHOW COLUMNS FROM `spells_new` LIKE 'not_extendable'|empty|
# 9021|2014_01_20_SpellCastingReinforcement.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '86' AND `slot` = '1' AND `effectid` = '128'|empty|
9022|2014_01_20_Weather.sql|SHOW COLUMNS FROM `zone` LIKE 'rain_chance1'|empty|
# 9023|2014_01_27_CritcalMendAA.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '230' AND `slot` = '1' AND `effectid` = '275'|empty
# 9024|2014_02_02_SpellCriticalsAA.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '4755' AND `slot` = '1' AND `effectid` = '294'|empty
9025|2014_02_13_Rename_instance_lockout_tables.sql|SHOW TABLES LIKE 'instance_list'|empty|
9026|2014_02_13_spells_new_update.sql|SHOW COLUMNS FROM `spells_new` LIKE 'ConeStartAngle'|empty|
9027|2014_02_20_buff_update.sql|SHOW COLUMNS FROM `character_buffs` LIKE 'caston_y'|empty|
9028|2014_02_26_roambox_update.sql|SHOW COLUMNS FROM `spawngroup` LIKE 'mindelay'|empty|
# 9029|2014_02_26_virulentvenomAA.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '888' AND `slot` = '1' AND `effectid` = '250'|empty|
9030|2014_04_04_PhysicalResist.sql|SHOW COLUMNS FROM `npc_types` LIKE 'PhR'|empty|
9031|2014_04_10_No_Target_With_Hotkey.sql|SHOW COLUMNS FROM `npc_types` LIKE 'no_target_hotkey'|empty|
9032|2014_04_12_SlowMitigation.sql|SHOW COLUMNS FROM `npc_types` LIKE 'slow_mitigation'|contains|float
9034|2014_04_25_spawn_events.sql|SHOW COLUMNS FROM `spawn_events` LIKE 'strict'|empty|
9035|2014_04_27_AISpellEffects.sql|SHOW COLUMNS FROM `npc_types` LIKE 'npc_spells_effects_id'|empty|
9036|2014_05_04_SlowMitigationFix.sql|SHOW COLUMNS FROM `npc_types` LIKE 'slow_mitigation'|contains|float
# 9038|2014_06_25_AA_Updates.sql|SELECT * FROM `altadv_vars` WHERE `skill_id` = '1604'|empty
# 9039|2014_07_04_AA_Updates.sql|SELECT * FROM `aa_effects` WHERE `aaid` = '158' AND `slot` = '1' AND `effectid` = '238'|empty
9040|2014_07_10_npc_spells.sql|SHOW COLUMNS FROM `npc_spells` LIKE 'engaged_no_sp_recast_min'|empty|
9041|2014_08_02_spells_new.sql|SHOW COLUMNS FROM `spells_new` LIKE 'viral_range'|empty|
9042|2014_08_12_NPC_raid_targets.sql|SHOW COLUMNS FROM `npc_types` LIKE 'raid_target'|empty|
9043|2014_08_18_spells_new_update.sql|SHOW COLUMNS FROM `spells_new` LIKE 'viral_targets'|empty|
9044|2014_08_20_merchantlist_probability.sql|SHOW COLUMNS FROM `merchantlist` LIKE 'probability'|empty|
9045|2014_08_23_Complete_QueryServ_Table_Structures.sql|SHOW TABLES LIKE 'qs_player_aa_rate_hourly'|empty|
9046|2014_08_23_player_events_and_player_aa_rate_hourly.sql|SHOW TABLES LIKE 'qs_player_events'|empty|
9048|2014_09_09_attack_delay.sql|SHOW COLUMNS FROM `npc_types` LIKE 'attack_delay'|empty|
9050|2014_09_20_ban_messages.sql|SHOW COLUMNS FROM `account` LIKE 'ban_reason'|empty|
9051|2014_10_11_RaidMOTD.sql|SHOW COLUMNS FROM `raid_details` LIKE 'motd'|empty|
9052|2014_10_13_RaidLeadership.sql|SHOW TABLES LIKE 'raid_leaders'|empty|
9053|2014_10_18_group_mentor.sql|SHOW COLUMNS FROM `group_leaders` LIKE 'mentoree'|empty|
9054|2014_10_19_raid_group_mentor.sql|SHOW COLUMNS FROM `raid_leaders` LIKE 'mentoree'|empty|
9055|2014_10_30_special_abilities_null.sql|SHOW COLUMNS FROM `npc_types` LIKE 'special_abilities'|contains|NO
9056|2014_11_08_RaidMembers.sql|SHOW COLUMNS FROM `raid_members` LIKE 'groupid'|missing|unsigned
9057|2014_11_13_spells_new_updates.sql|SHOW COLUMNS FROM `spells_new` LIKE 'disallow_sit'|empty|
9058|2014_11_26_InventoryTableUpdate.sql|SHOW COLUMNS FROM `inventory` LIKE 'ornamenticon'|empty|
9059|2014_12_01_mercs_table_update.sql|SHOW COLUMNS FROM `mercs` LIKE 'MercSize'|empty|
9060|2014_12_09_items_table_update.sql|SHOW COLUMNS FROM `items` LIKE 'herosforgemodel'|empty|
9061|2014_12_13_inventory_table_update.sql|SHOW COLUMNS FROM `inventory` LIKE 'ornament_hero_model'|empty|
9062|2014_12_15_multiple_table_updates.sql|SHOW COLUMNS FROM `items` LIKE 'augslot6type'|empty|
9063|2014_12_24_npc_types_update.sql|SHOW COLUMNS FROM `npc_types` LIKE 'd_melee_texture1'|empty|
9064|2014_12_24_npc_types_table_update.sql|SHOW COLUMNS FROM `npc_types` LIKE 'herosforgemodel'|empty|
9065|2014_12_26_merc_weaponinfo_table_update.sql|SHOW COLUMNS FROM `vwMercNpcTypes` LIKE 'd_melee_texture1'|empty|
9066|2014_12_31_npc_types_default_values_update.sql|SHOW COLUMNS FROM `npc_types` LIKE 'bodytype'|contains|YES
9067|2015_01_21_npc_types_update.sql|SHOW COLUMNS FROM `npc_types` LIKE 'light'|empty|
9068|2015_01_15_logsys_categories_table.sql|SHOW TABLES LIKE 'logsys_categories'|empty|
9069|2015_01_25_logsys_Mercenaries_category.sql|SELECT * FROM `logsys_categories` WHERE `log_category_description` LIKE 'Mercenaries'|empty|
9070|2015_01_28_quest_debug_log_category.sql|SELECT * FROM `logsys_categories` WHERE `log_category_description` LIKE 'Quest Debug'|empty|
9071|2015_01_29_merc_stats_table_update.sql|SHOW COLUMNS FROM `merc_stats` LIKE 'statscale'|empty|
9072|2015_01_30_merc_attack_delay.sql|SHOW COLUMNS FROM `merc_stats` LIKE 'attack_delay'|empty|
9073|2015_01_31_character_item_recast.sql|SHOW TABLES LIKE 'character_item_recast'|empty|
9074|2015_02_01_logsys_packet_logs.sql|SELECT * FROM `logsys_categories` WHERE `log_category_description` LIKE 'Packet: Server -> Client'|empty|
9075|2015_02_02_logsys_packet_logs_with_dump.sql|SELECT * FROM `logsys_categories` WHERE `log_category_description` LIKE 'Packet: Server -> Client With Dump'|empty|
9076|2014_10_30_special_abilities_null.sql|SHOW COLUMNS FROM `loottable` WHERE Field = 'avgcoin'|contains|smallint
# Upgrade conditions:
# This won't be needed after this system is implemented, but it is used database that are not
# yet using the versioning system to figure out where the database is schema wise to determine
# which updates are necessary to run
#
# Example: Version|Filename.sql|Query_to_Check_Condition_For_Needed_Update|match type|text to match
# 0 = Database Version
# 1 = Filename.sql
# 2 = Query_to_Check_Condition_For_Needed_Update
# 3 = Match Type - If condition from match type to Value 4 is true, update will flag for needing to be ran
# contains = If query results contains text from 4th value
# match = If query results matches text from 4th value
# missing = If query result is missing text from 4th value
# empty = If the query results in no results
# not_empty = If the query is not empty
# 4 = Text to match
#
#
@@ -0,0 +1,74 @@
-- A fix for the auto-conversion view renaming issue
DROP VIEW IF EXISTS `vwbotcharactermobs`;
DROP VIEW IF EXISTS `vwbotgroups`;
DROP VIEW IF EXISTS `vwgroups`;
DROP VIEW IF EXISTS `vwguildmembers`;
CREATE VIEW `vwBotCharacterMobs` AS
SELECT _utf8'C' AS mobtype,
c.`id`,
c.`name`,
c.`class`,
c.`level`,
c.`last_login`,
c.`zone_id`
FROM `character_data` AS c
UNION ALL
SELECT _utf8'B' AS mobtype,
b.`BotID` AS id,
b.`Name` AS name,
b.`Class` AS class,
b.`BotLevel` AS level,
0 AS timelaston,
0 AS zoneid
FROM bots AS b;
CREATE VIEW `vwGroups` AS
SELECT g.`groupid` AS groupid,
GetMobType(g.`name`) AS mobtype,
g.`name` AS name,
g.`charid` AS mobid,
IFNULL(c.`level`, b.`BotLevel`) AS level
FROM `group_id` AS g
LEFT JOIN `character_data` AS c ON g.`name` = c.`name`
LEFT JOIN `bots` AS b ON g.`name` = b.`Name`;
CREATE VIEW `vwBotGroups` AS
SELECT g.`BotGroupId`,
g.`BotGroupName`,
g.`BotGroupLeaderBotId`,
b.`Name` AS BotGroupLeaderName,
b.`BotOwnerCharacterId`,
c.`name` AS BotOwnerCharacterName
FROM `botgroup` AS g
JOIN `bots` AS b ON g.`BotGroupLeaderBotId` = b.`BotID`
JOIN `character_data` AS c ON b.`BotOwnerCharacterID` = c.`id`
ORDER BY b.`BotOwnerCharacterId`, g.`BotGroupName`;
CREATE VIEW `vwGuildMembers` AS
SELECT 'C' AS mobtype,
cm.`char_id`,
cm.`guild_id`,
cm.`rank`,
cm.`tribute_enable`,
cm.`total_tribute`,
cm.`last_tribute`,
cm.`banker`,
cm.`public_note`,
cm.`alt`
FROM `guild_members` AS cm
UNION ALL
SELECT 'B' AS mobtype,
bm.`char_id`,
bm.`guild_id`,
bm.`rank`,
bm.`tribute_enable`,
bm.`total_tribute`,
bm.`last_tribute`,
bm.`banker`,
bm.`public_note`,
bm.`alt`
FROM `botguildmembers` AS bm;
@@ -0,0 +1,280 @@
-- 'load_bots_old' sql script file
-- current as of 10/15/2014
--
-- Use this file on databases where the player profile blob has not been converted
--
-- Note: This file assumes a database free of bot remnants. If you have a prior
-- bot installation and wish to reload the default schema and entries, then
-- source 'drop_bots.sql' before sourcing this file.
ALTER TABLE `guild_members` DROP PRIMARY KEY;
ALTER TABLE `group_id` DROP PRIMARY KEY, ADD PRIMARY KEY USING BTREE(`groupid`, `charid`, `name`, `ismerc`);
UPDATE `spawn2` SET `enabled` = 1 WHERE `id` IN (59297,59298);
-- old command kept for reference (`commands` now only has 2 columns - `command` and `access`)
-- INSERT INTO `commands` VALUES ('bot', '0', 'Type \"#bot help\" to the see the list of available commands for bots.');
INSERT INTO `commands` VALUES ('bot', '0');
INSERT INTO `rule_values` VALUES
('1', 'Bots:BotAAExpansion', '8', 'The expansion through which bots will obtain AAs'),
('1', 'Bots:BotFinishBuffing', 'false', 'Allow for buffs to complete even if the bot caster is out of mana. Only affects buffing out of combat.'),
('1', 'Bots:BotGroupBuffing', 'false', 'Bots will cast single target buffs as group buffs, default is false for single. Does not make single target buffs work for MGB.'),
('1', 'Bots:BotManaRegen', '3.0', 'Adjust mana regen for bots, 1 is fast and higher numbers slow it down 3 is about the same as players.'),
('1', 'Bots:BotQuest', 'false', 'Optional quest method to manage bot spawn limits using the quest_globals name bot_spawn_limit, see: /bazaar/Aediles_Thrall.pl'),
('1', 'Bots:BotSpellQuest', 'false', 'Anita Thrall\'s (Anita_Thrall.pl) Bot Spell Scriber quests.'),
('1', 'Bots:CreateBotCount', '150', 'Number of bots that each account can create'),
('1', 'Bots:SpawnBotCount', '71', 'Number of bots a character can have spawned at one time, You + 71 bots is a 12 group raid');
CREATE TABLE `bots` (
`BotID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`BotOwnerCharacterID` INT(10) UNSIGNED NOT NULL,
`BotSpellsID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`Name` VARCHAR(64) NOT NULL,
`LastName` VARCHAR(32) DEFAULT NULL,
`BotLevel` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0',
`Race` SMALLINT(5) NOT NULL DEFAULT '0',
`Class` TINYINT(2) NOT NULL DEFAULT '0',
`Gender` TINYINT(2) NOT NULL DEFAULT '0',
`Size` FLOAT NOT NULL DEFAULT '0',
`Face` INT(10) NOT NULL DEFAULT '1',
`LuclinHairStyle` INT(10) NOT NULL DEFAULT '1',
`LuclinHairColor` INT(10) NOT NULL DEFAULT '1',
`LuclinEyeColor` INT(10) NOT NULL DEFAULT '1',
`LuclinEyeColor2` INT(10) NOT NULL DEFAULT '1',
`LuclinBeardColor` INT(10) NOT NULL DEFAULT '1',
`LuclinBeard` INT(10) NOT NULL DEFAULT '0',
`DrakkinHeritage` INT(10) NOT NULL DEFAULT '0',
`DrakkinTattoo` INT(10) NOT NULL DEFAULT '0',
`DrakkinDetails` INT(10) NOT NULL DEFAULT '0',
`HP` INTEGER NOT NULL DEFAULT '0',
`Mana` INTEGER NOT NULL DEFAULT '0',
`MR` SMALLINT(5) NOT NULL DEFAULT '0',
`CR` SMALLINT(5) NOT NULL DEFAULT '0',
`DR` SMALLINT(5) NOT NULL DEFAULT '0',
`FR` SMALLINT(5) NOT NULL DEFAULT '0',
`PR` SMALLINT(5) NOT NULL DEFAULT '0',
`Corrup` SMALLINT(5) NOT NULL DEFAULT '0',
`AC` SMALLINT(5) NOT NULL DEFAULT '0',
`STR` MEDIUMINT(8) NOT NULL DEFAULT '75',
`STA` MEDIUMINT(8) NOT NULL DEFAULT '75',
`DEX` MEDIUMINT(8) NOT NULL DEFAULT '75',
`AGI` MEDIUMINT(8) NOT NULL DEFAULT '75',
`_INT` MEDIUMINT(8) NOT NULL DEFAULT '80',
`WIS` MEDIUMINT(8) NOT NULL DEFAULT '75',
`CHA` MEDIUMINT(8) NOT NULL DEFAULT '75',
`ATK` MEDIUMINT(9) NOT NULL DEFAULT '0',
`BotCreateDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastSpawnDate` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`TotalPlayTime` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`LastZoneId` SMALLINT(6) NOT NULL DEFAULT '0',
`BotInspectMessage` VARCHAR(256) NOT NULL DEFAULT '',
PRIMARY KEY (`BotID`)
) ENGINE=InnoDB;
CREATE TABLE `botstances` (
`BotID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`StanceID` TINYINT UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`BotID`),
CONSTRAINT `FK_botstances_1` FOREIGN KEY (`BotID`) REFERENCES `bots` (`BotID`)
);
CREATE TABLE `bottimers` (
`BotID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`TimerID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`Value` INT(10) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`BotID`),
CONSTRAINT `FK_bottimers_1` FOREIGN KEY (`BotID`) REFERENCES `bots` (`BotID`)
);
CREATE TABLE `botbuffs` (
`BotBuffId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`BotId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`SpellId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`CasterLevel` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`DurationFormula` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`TicsRemaining` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`PoisonCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`DiseaseCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`CurseCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`CorruptionCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`HitCount` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`MeleeRune` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`MagicRune` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`DeathSaveSuccessChance` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`CasterAARank` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`Persistent` TINYINT(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`BotBuffId`),
KEY `FK_botbuff_1` (`BotId`),
CONSTRAINT `FK_botbuff_1` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
CREATE TABLE `botinventory` (
`BotInventoryID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`BotID` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`SlotID` INTEGER SIGNED NOT NULL DEFAULT '0',
`ItemID` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`charges` TINYINT(3) UNSIGNED DEFAULT 0,
`color` INTEGER UNSIGNED NOT NULL DEFAULT 0,
`augslot1` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
`augslot2` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
`augslot3` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
`augslot4` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
`augslot5` MEDIUMINT(7) UNSIGNED DEFAULT 0,
`instnodrop` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`BotInventoryID`),
KEY `FK_botinventory_1` (`BotID`),
CONSTRAINT `FK_botinventory_1` FOREIGN KEY (`BotID`) REFERENCES `bots` (`BotID`)
) ENGINE=InnoDB;
CREATE TABLE `botpets` (
`BotPetsId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`PetId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`BotId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`Name` VARCHAR(64) NULL,
`Mana` INTEGER NOT NULL DEFAULT '0',
`HitPoints` INTEGER NOT NULL DEFAULT '0',
PRIMARY KEY (`BotPetsId`),
KEY `FK_botpets_1` (`BotId`),
CONSTRAINT `FK_botpets_1` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`),
CONSTRAINT `U_botpets_1` UNIQUE (`BotId`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
CREATE TABLE `botpetbuffs` (
`BotPetBuffId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`BotPetsId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`SpellId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`CasterLevel` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`Duration` INT(11) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`BotPetBuffId`),
KEY `FK_botpetbuffs_1` (`BotPetsId`),
CONSTRAINT `FK_botpetbuffs_1` FOREIGN KEY (`BotPetsId`) REFERENCES `botpets` (`BotPetsID`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
CREATE TABLE `botpetinventory` (
`BotPetInventoryId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`BotPetsId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`ItemId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`BotPetInventoryId`),
KEY `FK_botpetinventory_1` (`BotPetsId`),
CONSTRAINT `FK_botpetinventory_1` FOREIGN KEY (`BotPetsId`) REFERENCES `botpets` (`BotPetsID`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
CREATE TABLE `botgroup` (
`BotGroupId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`BotGroupLeaderBotId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`BotGroupName` VARCHAR(64) NOT NULL,
PRIMARY KEY (`BotGroupId`),
KEY `FK_botgroup_1` (`BotGroupLeaderBotId`),
CONSTRAINT `FK_botgroup_1` FOREIGN KEY (`BotGroupLeaderBotId`) REFERENCES `bots` (`BotID`)
) ENGINE=InnoDB;
CREATE TABLE `botgroupmembers` (
`BotGroupMemberId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`BotGroupId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`BotId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`BotGroupMemberId`),
KEY `FK_botgroupmembers_1` (`BotGroupId`),
CONSTRAINT `FK_botgroupmembers_1` FOREIGN KEY (`BotGroupId`) REFERENCES `botgroup` (`BotGroupId`),
KEY `FK_botgroupmembers_2` (`BotId`),
CONSTRAINT `FK_botgroupmembers_2` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`)
) ENGINE=InnoDB;
CREATE TABLE `botguildmembers` (
`char_id` INT(11) NOT NULL DEFAULT '0',
`guild_id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
`rank` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`tribute_enable` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`total_tribute` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`last_tribute` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`banker` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`public_note` TEXT NULL,
`alt` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`char_id`)
) ENGINE=InnoDB;
DELIMITER $$
CREATE FUNCTION `GetMobType` (mobname VARCHAR(64)) RETURNS CHAR(1)
BEGIN
DECLARE Result CHAR(1);
SET Result = NULL;
IF (SELECT COUNT(*) FROM `character_` WHERE `name` = mobname) > 0 THEN
SET Result = 'C';
ELSEIF (SELECT COUNT(*) FROM `bots` WHERE `Name` = mobname) > 0 THEN
SET Result = 'B';
END IF;
RETURN Result;
END$$
DELIMITER ;
CREATE VIEW `vwBotCharacterMobs` AS
SELECT _utf8'C' AS mobtype,
c.`id`,
c.`name`,
c.`class`,
c.`level`,
c.`timelaston`,
c.`zoneid`
FROM `character_` AS c
UNION ALL
SELECT _utf8'B' AS mobtype,
b.`BotID` AS id,
b.`Name` AS name,
b.`Class` AS class,
b.`BotLevel` AS level,
0 AS timelaston,
0 AS zoneid
FROM bots AS b;
CREATE VIEW `vwGroups` AS
SELECT g.`groupid` AS groupid,
GetMobType(g.`name`) AS mobtype,
g.`name` AS name,
g.`charid` AS mobid,
IFNULL(c.`level`, b.`BotLevel`) AS level
FROM `group_id` AS g
LEFT JOIN `character_` AS c ON g.`name` = c.`name`
LEFT JOIN `bots` AS b ON g.`name` = b.`Name`;
CREATE VIEW `vwBotGroups` AS
SELECT g.`BotGroupId`,
g.`BotGroupName`,
g.`BotGroupLeaderBotId`,
b.`Name` AS BotGroupLeaderName,
b.`BotOwnerCharacterId`,
c.`name` AS BotOwnerCharacterName
FROM `botgroup` AS g
JOIN `bots` AS b ON g.`BotGroupLeaderBotId` = b.`BotID`
JOIN `character_` AS c ON b.`BotOwnerCharacterID` = c.`id`
ORDER BY b.`BotOwnerCharacterId`, g.`BotGroupName`;
CREATE VIEW `vwGuildMembers` AS
SELECT 'C' AS mobtype,
cm.`char_id`,
cm.`guild_id`,
cm.`rank`,
cm.`tribute_enable`,
cm.`total_tribute`,
cm.`last_tribute`,
cm.`banker`,
cm.`public_note`,
cm.`alt`
FROM `guild_members` AS cm
UNION ALL
SELECT 'B' AS mobtype,
bm.`char_id`,
bm.`guild_id`,
bm.`rank`,
bm.`tribute_enable`,
bm.`total_tribute`,
bm.`last_tribute`,
bm.`banker`,
bm.`public_note`,
bm.`alt`
FROM `botguildmembers` AS bm;
+35 -15
View File
@@ -1,21 +1,41 @@
DROP TABLE IF EXISTS `botbuffs`;
-- 'drop_bots' sql script file
-- current as of 10/15/2014
--
-- Note: This file will revert all changes made by either 'load_bots' sql file.
-- There may still be remnants of bot activity in tables `guild_members` and
-- `group_id`. If these entries are causing issues, you may need to manually
-- remove them.
--
-- If this script fails due to a 'SQL Error (1068): Multiple primary key defined'
-- error, run this query: ALTER TABLE `guild_members` DROP PRIMARY KEY;
-- and it should remove the key so this script will process in its entirety.
ALTER TABLE `guild_members` ADD PRIMARY KEY (`char_id`);
ALTER TABLE `group_id` DROP PRIMARY KEY, ADD PRIMARY KEY (`groupid`, `charid`, `ismerc`);
UPDATE `spawn2` SET `enabled` = 0 WHERE `id` IN (59297,59298);
DELETE FROM `commands` WHERE `command` = 'bot';
DELETE FROM `rule_values` WHERE `rule_name` LIKE 'Bots%';
DROP VIEW IF EXISTS `vwBotCharacterMobs`;
DROP VIEW IF EXISTS `vwBotGroups`;
DROP VIEW IF EXISTS `vwGroups`;
DROP VIEW IF EXISTS `vwGuildMembers`;
DROP FUNCTION IF EXISTS `GetMobType`;
DROP TABLE IF EXISTS `botguildmembers`;
DROP TABLE IF EXISTS `botgroupmembers`;
-- this table is not a part of 'load_bots.sql'
DROP TABLE IF EXISTS `botgroups`;
DROP TABLE IF EXISTS `botgroup`;
DROP TABLE IF EXISTS `botpetinventory`;
DROP TABLE IF EXISTS `botpetbuffs`;
DROP TABLE IF EXISTS `botpets`;
DROP TABLE IF EXISTS `botgroupmembers`;
DROP TABLE IF EXISTS `botgroup`;
DROP TABLE IF EXISTS `botgroups`;
DROP TABLE IF EXISTS `botinventory`;
DROP TABLE IF EXISTS `botguildmembers`;
DROP TABLE IF EXISTS `botstances`;
DROP TABLE IF EXISTS `botbuffs`;
DROP TABLE IF EXISTS `bottimers`;
DROP TABLE IF EXISTS `botstances`;
DROP TABLE IF EXISTS `bots`;
DROP VIEW IF EXISTS `vwGuildMembers`;
DROP VIEW IF EXISTS `vwBotCharacterMobs`;
DROP VIEW IF EXISTS `vwBotGroups`;
delete from rule_values where rule_name like 'Bots%' and ruleset_id = 1;
delete from commands where command = 'bot';
update spawn2 set enabled = 0 where id in (59297,59298);
+252 -279
View File
@@ -1,307 +1,280 @@
-- This is pretty much a straight copy of the original files with fixes applied.
-- HeidiSQL does not like sub-directory references, so this should now run from there.
-- The 'headers' are left in place for reference only.
-- 'load_bots' sql script file
-- current as of 10/15/2014
--
-- Use this file on databases where the player profile blob has been converted.
--
-- Note: This file assumes a database free of bot remnants. If you have a prior
-- bot installation and wish to reload the default schema and entries, then
-- source 'drop_bots.sql' before sourcing this file.
-- FILE:
-- source player_tables/botguildmembers.sql;
CREATE TABLE IF NOT EXISTS `botguildmembers` (
`char_id` int(11) NOT NULL default '0',
`guild_id` mediumint(8) unsigned NOT NULL default '0',
`rank` tinyint(3) unsigned NOT NULL default '0',
`tribute_enable` tinyint(3) unsigned NOT NULL default '0',
`total_tribute` int(10) unsigned NOT NULL default '0',
`last_tribute` int(10) unsigned NOT NULL default '0',
`banker` tinyint(3) unsigned NOT NULL default '0',
`public_note` text NULL,
`alt` tinyint(3) unsigned NOT NULL default '0',
PRIMARY KEY (`char_id`)
) ENGINE=InnoDB;
-- FILE:
-- source player_tables/bots.sql;
update spawn2 set enabled = 1 where id in (59297,59298);
ALTER TABLE `guild_members` DROP PRIMARY KEY;
ALTER TABLE `group_id` DROP PRIMARY KEY, ADD PRIMARY KEY USING BTREE(`groupid`, `charid`, `name`, `ismerc`);
INSERT INTO rule_values VALUES ('1', 'Bots:BotManaRegen', '3.0', 'Adjust mana regen for bots, 1 is fast and higher numbers slow it down 3 is about the same as players.');
INSERT INTO rule_values VALUES ('1', 'Bots:BotFinishBuffing', 'false', 'Allow for buffs to complete even if the bot caster is out of mana. Only affects buffing out of combat.');
INSERT INTO rule_values VALUES ('1', 'Bots:CreateBotCount', '150', 'Number of bots that each account can create');
INSERT INTO rule_values VALUES ('1', 'Bots:SpawnBotCount', '71', 'Number of bots a character can have spawned at one time, You + 71 bots is a 12 group raid');
INSERT INTO rule_values VALUES ('1', 'Bots:BotQuest', 'false', 'Optional quest method to manage bot spawn limits using the quest_globals name bot_spawn_limit, see: /bazaar/Aediles_Thrall.pl');
INSERT INTO rule_values VALUES ('1', 'Bots:BotGroupBuffing', 'false', 'Bots will cast single target buffs as group buffs, default is false for single. Does not make single target buffs work for MGB.');
INSERT INTO rule_values VALUES ('1', 'Bots:BotSpellQuest', 'false', 'Anita Thrall\'s (Anita_Thrall.pl) Bot Spell Scriber quests.');
UPDATE `spawn2` SET `enabled` = 1 WHERE `id` IN (59297,59298);
-- this is a hack fix to maintain the original file process
delete from rule_values where rule_name like 'Bots%' and ruleset_id = 1;
INSERT INTO rule_values VALUES ('1', 'Bots:BotAAExpansion', '8', 'The expansion through which bots will obtain AAs');
-- field count has changed
-- old command kept for reference (`commands` now only has 2 columns - `command` and `access`)
-- INSERT INTO `commands` VALUES ('bot', '0', 'Type \"#bot help\" to the see the list of available commands for bots.');
INSERT INTO `commands` VALUES ('bot', '0');
CREATE TABLE bots (
`BotID` int(10) unsigned NOT NULL AUTO_INCREMENT,
`BotOwnerCharacterID` int(10) unsigned NOT NULL,
`BotSpellsID` int(10) unsigned NOT NULL DEFAULT '0',
`Name` varchar(64) NOT NULL,
`LastName` varchar(32) DEFAULT NULL,
`BotLevel` tinyint(2) unsigned NOT NULL DEFAULT '0',
`Race` smallint(5) NOT NULL DEFAULT '0',
`Class` tinyint(2) NOT NULL DEFAULT '0',
`Gender` tinyint(2) NOT NULL DEFAULT '0',
`Size` float NOT NULL DEFAULT '0',
`Face` int(10) NOT NULL DEFAULT '1',
`LuclinHairStyle` int(10) NOT NULL DEFAULT '1',
`LuclinHairColor` int(10) NOT NULL DEFAULT '1',
`LuclinEyeColor` int(10) NOT NULL DEFAULT '1',
`LuclinEyeColor2` int(10) NOT NULL DEFAULT '1',
`LuclinBeardColor` int(10) NOT NULL DEFAULT '1',
`LuclinBeard` int(10) NOT NULL DEFAULT '0',
`DrakkinHeritage` int(10) NOT NULL DEFAULT '0',
`DrakkinTattoo` int(10) NOT NULL DEFAULT '0',
`DrakkinDetails` int(10) NOT NULL DEFAULT '0',
`HP` INTEGER NOT NULL DEFAULT '0',
`Mana` INTEGER NOT NULL DEFAULT '0',
`MR` smallint(5) NOT NULL DEFAULT '0',
`CR` smallint(5) NOT NULL DEFAULT '0',
`DR` smallint(5) NOT NULL DEFAULT '0',
`FR` smallint(5) NOT NULL DEFAULT '0',
`PR` smallint(5) NOT NULL DEFAULT '0',
`Corrup` SMALLINT(5) NOT NULL DEFAULT '0',
`AC` smallint(5) NOT NULL DEFAULT '0',
`STR` mediumint(8) NOT NULL DEFAULT '75',
`STA` mediumint(8) NOT NULL DEFAULT '75',
`DEX` mediumint(8) NOT NULL DEFAULT '75',
`AGI` mediumint(8) NOT NULL DEFAULT '75',
`_INT` mediumint(8) NOT NULL DEFAULT '80',
`WIS` mediumint(8) NOT NULL DEFAULT '75',
`CHA` mediumint(8) NOT NULL DEFAULT '75',
`ATK` mediumint(9) NOT NULL DEFAULT '0',
`BotCreateDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastSpawnDate` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`TotalPlayTime` int(10) unsigned NOT NULL DEFAULT '0',
`LastZoneId` smallint(6) NOT NULL DEFAULT '0',
`BotInspectMessage` VARCHAR(256) NOT NULL DEFAULT '',
PRIMARY KEY (`BotID`)
INSERT INTO `rule_values` VALUES
('1', 'Bots:BotAAExpansion', '8', 'The expansion through which bots will obtain AAs'),
('1', 'Bots:BotFinishBuffing', 'false', 'Allow for buffs to complete even if the bot caster is out of mana. Only affects buffing out of combat.'),
('1', 'Bots:BotGroupBuffing', 'false', 'Bots will cast single target buffs as group buffs, default is false for single. Does not make single target buffs work for MGB.'),
('1', 'Bots:BotManaRegen', '3.0', 'Adjust mana regen for bots, 1 is fast and higher numbers slow it down 3 is about the same as players.'),
('1', 'Bots:BotQuest', 'false', 'Optional quest method to manage bot spawn limits using the quest_globals name bot_spawn_limit, see: /bazaar/Aediles_Thrall.pl'),
('1', 'Bots:BotSpellQuest', 'false', 'Anita Thrall\'s (Anita_Thrall.pl) Bot Spell Scriber quests.'),
('1', 'Bots:CreateBotCount', '150', 'Number of bots that each account can create'),
('1', 'Bots:SpawnBotCount', '71', 'Number of bots a character can have spawned at one time, You + 71 bots is a 12 group raid');
CREATE TABLE `bots` (
`BotID` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`BotOwnerCharacterID` INT(10) UNSIGNED NOT NULL,
`BotSpellsID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`Name` VARCHAR(64) NOT NULL,
`LastName` VARCHAR(32) DEFAULT NULL,
`BotLevel` TINYINT(2) UNSIGNED NOT NULL DEFAULT '0',
`Race` SMALLINT(5) NOT NULL DEFAULT '0',
`Class` TINYINT(2) NOT NULL DEFAULT '0',
`Gender` TINYINT(2) NOT NULL DEFAULT '0',
`Size` FLOAT NOT NULL DEFAULT '0',
`Face` INT(10) NOT NULL DEFAULT '1',
`LuclinHairStyle` INT(10) NOT NULL DEFAULT '1',
`LuclinHairColor` INT(10) NOT NULL DEFAULT '1',
`LuclinEyeColor` INT(10) NOT NULL DEFAULT '1',
`LuclinEyeColor2` INT(10) NOT NULL DEFAULT '1',
`LuclinBeardColor` INT(10) NOT NULL DEFAULT '1',
`LuclinBeard` INT(10) NOT NULL DEFAULT '0',
`DrakkinHeritage` INT(10) NOT NULL DEFAULT '0',
`DrakkinTattoo` INT(10) NOT NULL DEFAULT '0',
`DrakkinDetails` INT(10) NOT NULL DEFAULT '0',
`HP` INTEGER NOT NULL DEFAULT '0',
`Mana` INTEGER NOT NULL DEFAULT '0',
`MR` SMALLINT(5) NOT NULL DEFAULT '0',
`CR` SMALLINT(5) NOT NULL DEFAULT '0',
`DR` SMALLINT(5) NOT NULL DEFAULT '0',
`FR` SMALLINT(5) NOT NULL DEFAULT '0',
`PR` SMALLINT(5) NOT NULL DEFAULT '0',
`Corrup` SMALLINT(5) NOT NULL DEFAULT '0',
`AC` SMALLINT(5) NOT NULL DEFAULT '0',
`STR` MEDIUMINT(8) NOT NULL DEFAULT '75',
`STA` MEDIUMINT(8) NOT NULL DEFAULT '75',
`DEX` MEDIUMINT(8) NOT NULL DEFAULT '75',
`AGI` MEDIUMINT(8) NOT NULL DEFAULT '75',
`_INT` MEDIUMINT(8) NOT NULL DEFAULT '80',
`WIS` MEDIUMINT(8) NOT NULL DEFAULT '75',
`CHA` MEDIUMINT(8) NOT NULL DEFAULT '75',
`ATK` MEDIUMINT(9) NOT NULL DEFAULT '0',
`BotCreateDate` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`LastSpawnDate` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`TotalPlayTime` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`LastZoneId` SMALLINT(6) NOT NULL DEFAULT '0',
`BotInspectMessage` VARCHAR(256) NOT NULL DEFAULT '',
PRIMARY KEY (`BotID`)
) ENGINE=InnoDB;
ALTER TABLE `group_id` DROP PRIMARY KEY, ADD PRIMARY KEY USING BTREE(`groupid`, `charid`, `name`);
ALTER TABLE `guild_members` DROP PRIMARY KEY;
CREATE TABLE `botstances` (
`BotID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`StanceID` TINYINT UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`BotID`),
CONSTRAINT `FK_botstances_1` FOREIGN KEY (`BotID`) REFERENCES `bots` (`BotID`)
);
DROP VIEW IF EXISTS `vwGuildMembers`;
CREATE VIEW `vwGuildMembers` AS
select 'C' as mobtype,
cm.char_id,
cm.guild_id,
cm.rank,
cm.tribute_enable,
cm.total_tribute,
cm.last_tribute,
cm.banker,
cm.public_note,
cm.alt
from guild_members as cm
union all
select 'B' as mobtype,
bm.char_id,
bm.guild_id,
bm.rank,
bm.tribute_enable,
bm.total_tribute,
bm.last_tribute,
bm.banker,
bm.public_note,
bm.alt
from botguildmembers as bm;
CREATE TABLE `bottimers` (
`BotID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`TimerID` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`Value` INT(10) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`BotID`),
CONSTRAINT `FK_bottimers_1` FOREIGN KEY (`BotID`) REFERENCES `bots` (`BotID`)
);
DROP VIEW IF EXISTS `vwBotCharacterMobs`;
CREATE VIEW `vwBotCharacterMobs` AS
select 'C' as mobtype,
c.id,
c.name,
c.class,
c.level,
c.timelaston,
c.zoneid
from character_ as c
union all
select 'B' as mobtype,
b.BotID as id,
b.Name as name,
b.Class as class,
b.BotLevel as level,
0 as timelaston,
0 as zoneid
from bots as b;
-- FILE:
-- source player_tables/botpetstatepersists.sql;
DROP TABLE IF EXISTS `botpetinventory`;
DROP TABLE IF EXISTS `botpetbuffs`;
DROP TABLE IF EXISTS `botpets`;
CREATE TABLE IF NOT EXISTS `botpets` (
`BotPetsId` integer unsigned NOT NULL AUTO_INCREMENT,
`PetId` integer unsigned NOT NULL DEFAULT '0',
`BotId` integer unsigned NOT NULL DEFAULT '0',
`Name` varchar(64) NULL,
`Mana` integer NOT NULL DEFAULT '0',
`HitPoints` integer NOT NULL DEFAULT '0',
PRIMARY KEY (`BotPetsId`),
KEY `FK_botpets_1` (`BotId`),
CONSTRAINT `FK_botpets_1` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`),
CONSTRAINT `U_botpets_1` UNIQUE (`BotId`)
CREATE TABLE `botbuffs` (
`BotBuffId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`BotId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`SpellId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`CasterLevel` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`DurationFormula` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`TicsRemaining` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`PoisonCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`DiseaseCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`CurseCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`CorruptionCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`HitCount` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`MeleeRune` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`MagicRune` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`DeathSaveSuccessChance` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`CasterAARank` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`Persistent` TINYINT(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`BotBuffId`),
KEY `FK_botbuff_1` (`BotId`),
CONSTRAINT `FK_botbuff_1` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `botpetbuffs` (
`BotPetBuffId` int(10) unsigned NOT NULL AUTO_INCREMENT,
`BotPetsId` int(10) unsigned NOT NULL DEFAULT '0',
`SpellId` int(10) unsigned NOT NULL DEFAULT '0',
`CasterLevel` int(10) unsigned NOT NULL DEFAULT '0',
`Duration` int(11) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`BotPetBuffId`),
KEY `FK_botpetbuffs_1` (`BotPetsId`),
CONSTRAINT `FK_botpetbuffs_1` FOREIGN KEY (`BotPetsId`) REFERENCES `botpets` (`BotPetsID`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `botpetinventory` (
`BotPetInventoryId` integer unsigned NOT NULL AUTO_INCREMENT,
`BotPetsId` integer unsigned NOT NULL DEFAULT '0',
`ItemId` integer unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`BotPetInventoryId`),
KEY `FK_botpetinventory_1` (`BotPetsId`),
CONSTRAINT `FK_botpetinventory_1` FOREIGN KEY (`BotPetsId`) REFERENCES `botpets` (`BotPetsID`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
-- FILE:
-- source player_tables/botinventory.sql;
CREATE TABLE IF NOT EXISTS botinventory (
BotInventoryID integer unsigned NOT NULL auto_increment,
BotID integer unsigned NOT NULL DEFAULT '0',
SlotID integer signed NOT NULL DEFAULT '0',
ItemID integer unsigned NOT NULL DEFAULT '0',
charges tinyint(3) unsigned DEFAULT 0,
color integer unsigned NOT NULL DEFAULT 0,
augslot1 mediumint(7) unsigned NOT NULL DEFAULT 0,
augslot2 mediumint(7) unsigned NOT NULL DEFAULT 0,
augslot3 mediumint(7) unsigned NOT NULL DEFAULT 0,
augslot4 mediumint(7) unsigned NOT NULL DEFAULT 0,
augslot5 mediumint(7) unsigned DEFAULT 0,
instnodrop tinyint(1) unsigned NOT NULL DEFAULT 0,
PRIMARY KEY (BotInventoryID),
KEY FK_botinventory_1 (BotID),
CONSTRAINT FK_botinventory_1 FOREIGN KEY (BotID) REFERENCES bots (BotID)
CREATE TABLE `botinventory` (
`BotInventoryID` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`BotID` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`SlotID` INTEGER SIGNED NOT NULL DEFAULT '0',
`ItemID` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`charges` TINYINT(3) UNSIGNED DEFAULT 0,
`color` INTEGER UNSIGNED NOT NULL DEFAULT 0,
`augslot1` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
`augslot2` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
`augslot3` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
`augslot4` MEDIUMINT(7) UNSIGNED NOT NULL DEFAULT 0,
`augslot5` MEDIUMINT(7) UNSIGNED DEFAULT 0,
`instnodrop` TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY (`BotInventoryID`),
KEY `FK_botinventory_1` (`BotID`),
CONSTRAINT `FK_botinventory_1` FOREIGN KEY (`BotID`) REFERENCES `bots` (`BotID`)
) ENGINE=InnoDB;
-- FILE:
-- source player_tables/botbuffs.sql;
DROP TABLE IF EXISTS `botbuffs`;
CREATE TABLE `botbuffs` (
`BotBuffId` int(10) unsigned NOT NULL AUTO_INCREMENT,
`BotId` int(10) unsigned NOT NULL DEFAULT '0',
`SpellId` int(10) unsigned NOT NULL DEFAULT '0',
`CasterLevel` int(10) unsigned NOT NULL DEFAULT '0',
`DurationFormula` int(10) unsigned NOT NULL DEFAULT '0',
`TicsRemaining` int(11) unsigned NOT NULL DEFAULT '0',
`PoisonCounters` int(11) unsigned NOT NULL DEFAULT '0',
`DiseaseCounters` int(11) unsigned NOT NULL DEFAULT '0',
`CurseCounters` int(11) unsigned NOT NULL DEFAULT '0',
`CorruptionCounters` INT(11) UNSIGNED NOT NULL DEFAULT '0',
`HitCount` int(10) unsigned NOT NULL DEFAULT '0',
`MeleeRune` int(10) unsigned NOT NULL DEFAULT '0',
`MagicRune` int(10) unsigned NOT NULL DEFAULT '0',
`DeathSaveSuccessChance` int(10) unsigned NOT NULL DEFAULT '0',
`CasterAARank` int(10) unsigned NOT NULL DEFAULT '0',
`Persistent` tinyint(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`BotBuffId`),
KEY `FK_botbuff_1` (`BotId`),
CONSTRAINT `FK_botbuff_1` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`)
CREATE TABLE `botpets` (
`BotPetsId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`PetId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`BotId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`Name` VARCHAR(64) NULL,
`Mana` INTEGER NOT NULL DEFAULT '0',
`HitPoints` INTEGER NOT NULL DEFAULT '0',
PRIMARY KEY (`BotPetsId`),
KEY `FK_botpets_1` (`BotId`),
CONSTRAINT `FK_botpets_1` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`),
CONSTRAINT `U_botpets_1` UNIQUE (`BotId`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
-- FILE:
-- source player_tables/botadventuring.sql;
CREATE TABLE `botpetbuffs` (
`BotPetBuffId` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`BotPetsId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`SpellId` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`CasterLevel` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`Duration` INT(11) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`BotPetBuffId`),
KEY `FK_botpetbuffs_1` (`BotPetsId`),
CONSTRAINT `FK_botpetbuffs_1` FOREIGN KEY (`BotPetsId`) REFERENCES `botpets` (`BotPetsID`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
CREATE TABLE `botpetinventory` (
`BotPetInventoryId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`BotPetsId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`ItemId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`BotPetInventoryId`),
KEY `FK_botpetinventory_1` (`BotPetsId`),
CONSTRAINT `FK_botpetinventory_1` FOREIGN KEY (`BotPetsId`) REFERENCES `botpets` (`BotPetsID`)
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1;
CREATE TABLE `botgroup` (
`BotGroupId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`BotGroupLeaderBotId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`BotGroupName` VARCHAR(64) NOT NULL,
PRIMARY KEY (`BotGroupId`),
KEY `FK_botgroup_1` (`BotGroupLeaderBotId`),
CONSTRAINT `FK_botgroup_1` FOREIGN KEY (`BotGroupLeaderBotId`) REFERENCES `bots` (`BotID`)
) ENGINE=InnoDB;
CREATE TABLE `botgroupmembers` (
`BotGroupMemberId` INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
`BotGroupId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
`BotId` INTEGER UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`BotGroupMemberId`),
KEY `FK_botgroupmembers_1` (`BotGroupId`),
CONSTRAINT `FK_botgroupmembers_1` FOREIGN KEY (`BotGroupId`) REFERENCES `botgroup` (`BotGroupId`),
KEY `FK_botgroupmembers_2` (`BotId`),
CONSTRAINT `FK_botgroupmembers_2` FOREIGN KEY (`BotId`) REFERENCES `bots` (`BotID`)
) ENGINE=InnoDB;
CREATE TABLE `botguildmembers` (
`char_id` INT(11) NOT NULL DEFAULT '0',
`guild_id` MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
`rank` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`tribute_enable` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`total_tribute` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`last_tribute` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`banker` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
`public_note` TEXT NULL,
`alt` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`char_id`)
) ENGINE=InnoDB;
DELIMITER $$
DROP FUNCTION IF EXISTS `GetMobType` $$
CREATE FUNCTION `GetMobType` (mobname VARCHAR(64)) RETURNS CHAR(1)
BEGIN
DECLARE Result CHAR(1);
SET Result = NULL;
IF (select count(*) from character_ where name = mobname) > 0 THEN
SET Result = 'C';
ELSEIF (select count(*) from bots where Name = mobname) > 0 THEN
SET Result = 'B';
END IF;
RETURN Result;
END $$
DECLARE Result CHAR(1);
SET Result = NULL;
IF (SELECT COUNT(*) FROM `character_data` WHERE `name` = mobname) > 0 THEN
SET Result = 'C';
ELSEIF (SELECT COUNT(*) FROM `bots` WHERE `Name` = mobname) > 0 THEN
SET Result = 'B';
END IF;
RETURN Result;
END$$
DELIMITER ;
DROP VIEW IF EXISTS `vwGroups`;
CREATE VIEW `vwBotCharacterMobs` AS
SELECT _utf8'C' AS mobtype,
c.`id`,
c.`name`,
c.`class`,
c.`level`,
c.`last_login`,
c.`zone_id`
FROM `character_data` AS c
UNION ALL
SELECT _utf8'B' AS mobtype,
b.`BotID` AS id,
b.`Name` AS name,
b.`Class` AS class,
b.`BotLevel` AS level,
0 AS timelaston,
0 AS zoneid
FROM bots AS b;
CREATE VIEW `vwGroups` AS
select g.groupid as groupid,
GetMobType(g.name) as mobtype,
g.name as name,
g.charid as mobid,
ifnull(c.level, b.BotLevel) as level
from group_id as g
left join character_ as c on g.name = c.name
left join bots as b on g.name = b.Name;
SELECT g.`groupid` AS groupid,
GetMobType(g.`name`) AS mobtype,
g.`name` AS name,
g.`charid` AS mobid,
IFNULL(c.`level`, b.`BotLevel`) AS level
FROM `group_id` AS g
LEFT JOIN `character_data` AS c ON g.`name` = c.`name`
LEFT JOIN `bots` AS b ON g.`name` = b.`Name`;
-- FILE:
-- source player_tables/botgroups.sql;
DROP TABLE IF EXISTS `botgroupmembers`;
DROP TABLE IF EXISTS `botgroup`;
CREATE TABLE IF NOT EXISTS `botgroup` (
`BotGroupId` integer unsigned NOT NULL AUTO_INCREMENT,
`BotGroupLeaderBotId` integer unsigned NOT NULL DEFAULT '0',
`BotGroupName` varchar(64) NOT NULL,
PRIMARY KEY (`BotGroupId`),
KEY FK_botgroup_1 (BotGroupLeaderBotId),
CONSTRAINT FK_botgroup_1 FOREIGN KEY (BotGroupLeaderBotId) REFERENCES bots (BotID)
) ENGINE=InnoDB;
CREATE TABLE IF NOT EXISTS `botgroupmembers` (
`BotGroupMemberId` integer unsigned NOT NULL AUTO_INCREMENT,
`BotGroupId` integer unsigned NOT NULL DEFAULT '0',
`BotId` integer unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`BotGroupMemberId`),
KEY FK_botgroupmembers_1 (BotGroupId),
CONSTRAINT FK_botgroupmembers_1 FOREIGN KEY (BotGroupId) REFERENCES botgroup (BotGroupId),
KEY FK_botgroupmembers_2 (BotId),
CONSTRAINT FK_botgroupmembers_2 FOREIGN KEY (BotId) REFERENCES bots (BotID)
) ENGINE=InnoDB;
DROP VIEW IF EXISTS `vwBotGroups`;
CREATE VIEW `vwBotGroups` AS
select g.BotGroupId,
g.BotGroupName,
g.BotGroupLeaderBotId,
b.Name as BotGroupLeaderName,
b.BotOwnerCharacterId,
c.name as BotOwnerCharacterName
from botgroup as g
join bots as b on g.BotGroupLeaderBotId = b.BotID
join character_ as c on b.BotOwnerCharacterID = c.id
order by b.BotOwnerCharacterId, g.BotGroupName;
SELECT g.`BotGroupId`,
g.`BotGroupName`,
g.`BotGroupLeaderBotId`,
b.`Name` AS BotGroupLeaderName,
b.`BotOwnerCharacterId`,
c.`name` AS BotOwnerCharacterName
FROM `botgroup` AS g
JOIN `bots` AS b ON g.`BotGroupLeaderBotId` = b.`BotID`
JOIN `character_data` AS c ON b.`BotOwnerCharacterID` = c.`id`
ORDER BY b.`BotOwnerCharacterId`, g.`BotGroupName`;
-- FILE:
-- source player_tables/botstances.sql;
CREATE TABLE botstances (
BotID int(10) unsigned NOT NULL default '0',
StanceID tinyint unsigned NOT NULL default '0',
PRIMARY KEY (BotID),
CONSTRAINT FK_botstances_1 FOREIGN KEY (BotID) REFERENCES bots (BotID)
);
-- FILE:
-- source player_tables/bottimers.sql;
CREATE TABLE bottimers (
BotID int(10) unsigned NOT NULL default '0',
TimerID int(10) unsigned NOT NULL default '0',
Value int(10) unsigned NOT NULL default '0',
PRIMARY KEY (BotID),
CONSTRAINT FK_bottimers_1 FOREIGN KEY (BotID) REFERENCES bots (BotID)
)
CREATE VIEW `vwGuildMembers` AS
SELECT 'C' AS mobtype,
cm.`char_id`,
cm.`guild_id`,
cm.`rank`,
cm.`tribute_enable`,
cm.`total_tribute`,
cm.`last_tribute`,
cm.`banker`,
cm.`public_note`,
cm.`alt`
FROM `guild_members` AS cm
UNION ALL
SELECT 'B' AS mobtype,
bm.`char_id`,
bm.`guild_id`,
bm.`rank`,
bm.`tribute_enable`,
bm.`total_tribute`,
bm.`last_tribute`,
bm.`banker`,
bm.`public_note`,
bm.`alt`
FROM `botguildmembers` AS bm;
@@ -0,0 +1,13 @@
-- Fix Salvage
UPDATE `aa_effects` SET `effectid` = '331' WHERE `aaid` IN (997, 998, 999);
-- Rapid Strikes missing entries
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('818', '1', '279', '17', '0');
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('819', '1', '279', '19', '0');
-- Secondary Forte fixes client side display issues
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('691', '1', '248', '100', '0');
-- Packrat this is what live uses
UPDATE `aa_effects` SET `base1` = '3' WHERE `aaid` = 678;
UPDATE `aa_effects` SET `base1` = '6' WHERE `aaid` = 679;
UPDATE `aa_effects` SET `base1` = '9' WHERE `aaid` = 680;
UPDATE `aa_effects` SET `base1` = '12' WHERE `aaid` = 681;
UPDATE `aa_effects` SET `base1` = '15' WHERE `aaid` = 682;
@@ -0,0 +1,2 @@
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Zone:EnableLoggedOffReplenishments', 'true', 'Replenish mana/hp/end if logged off for MinOfflineTimeToReplenishments');
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Zone:MinOfflineTimeToReplenishments', '21600', 'Minimum logged off time to trigger replenish mana/hp/end');
@@ -0,0 +1,4 @@
INSERT INTO altadv_vars SET skill_id="4698", name="Quick Draw", cost="5", max_level="1", hotkey_sid="4294967295", hotkey_sid2="4294967295", title_sid="4698", desc_sid="4698", type="1", spellid="4294967295", prereq_skill="0", prereq_minpoints="0", spell_type="0", spell_refresh="0", class_type="51", cost_inc="0", aa_expansion="12", special_category="4294967295", sof_type="1", sof_cost_inc="0", sof_max_level="2", sof_next_skill="4698", clientver="4", account_time_required="0", sof_current_level="0", sof_next_id="6545", level_inc="0", classes="65534", berserker="1";
INSERT INTO aa_effects SET aaid=4698, slot=1, effectid=362, base1=1, base2=0;
INSERT INTO altadv_vars SET skill_id="6545", name="Quick Draw II", cost="5", max_level="1", hotkey_sid="4294967295", hotkey_sid2="4294967295", title_sid="4698", desc_sid="4698", type="1", spellid="4294967295", prereq_skill="4698", prereq_minpoints="1", spell_type="0", spell_refresh="0", class_type="56", cost_inc="0", aa_expansion="14", special_category="4294967295", sof_type="1", sof_cost_inc="0", sof_max_level="2", sof_next_skill="4698", clientver="5", account_time_required="0", sof_current_level="1", sof_next_id="0", level_inc="0", classes="65534", berserker="1";
INSERT INTO aa_effects SET aaid=6545, slot=1, effectid=362, base1=1, base2=0;
@@ -0,0 +1 @@
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Client:UseLiveFactionMessage', 'false', 'Allow players to see faction adjustments like Live.');
@@ -0,0 +1 @@
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Spells:SwarmPetTargetLock', 'false', 'Use old method of swarm pet AI, where they lock onto a set target then depop when target is dead.');
@@ -0,0 +1 @@
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'NPC:EnableMeritBasedFaction', 'false', 'If set to true, faction will be given in the same way as experience (solo/group/raid).');
@@ -0,0 +1,3 @@
/* Optional Transformation Rules */
INSERT INTO `rule_values` VALUES (1, 'Inventory:DeleteTransformationMold', 'true', 'false to keep transformation mold forever');
INSERT INTO `rule_values` VALUES (1, 'Inventory:AllowAnyWeaponTransformation', 'false', 'True allows any MELEE weapon to use the other melee type transformatios');
@@ -0,0 +1 @@
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Combat:ProjectileDmgOnImpact', 'true', 'If enabled, projectiles (ie arrows) will hit on impact, instead of instantly.');
@@ -0,0 +1,2 @@
INSERT INTO `commands` (`command`, `access`) VALUES ('heromodel', 80);
INSERT INTO `commands` (`command`, `access`) VALUES ('hm', 80);
@@ -0,0 +1,2 @@
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Spells:NPC_UseFocusFromSpells', 'true', 'Allow npcs to use most spell buff derived focus effects.');
INSERT INTO `rule_values` (`ruleset_id`, `rule_name`, `rule_value`, `notes`) VALUES (1, 'Spells:NPC_UseFocusFromItems', 'false', 'Allow npcs to use most item derived focus effects.');
@@ -0,0 +1,5 @@
-- 'greater lightstone' light level on 'wisp' race
UPDATE `npc_types` SET `light` = 11 WHERE `race` = 69;
-- 'fire beetle eye' light level on 'beetle' race with name criteria
UPDATE `npc_types` SET `light` = 12 WHERE `race` = 22 AND (`name` LIKE '%fire%' OR `name` LIKE '%lava%');
@@ -0,0 +1,30 @@
DELIMITER $$
CREATE PROCEDURE `MyFaction`(charname text)
BEGIN
declare class_mod text default "";
declare race_mod text default "";
declare deity_mod text default "";
select class into class_mod from character_data where name = charname;
select race into race_mod from character_data where name = charname;
select deity into deity_mod from character_data where name = charname;
select concat("c", class_mod) into class_mod;
select concat("r", race_mod) into race_mod;
select concat("d", deity_mod) into deity_mod;
set @class_bump := 0;
set @race_bump := 0;
set @deity_bump := 0;
SELECT race_mod as R, class_mod as C, deity_mod as D, f.name as faction, f.id, v.current_value, f.base as "START",
@class_bump := IFNULL((select m.mod from faction_list_mod m where faction_id = f.id && class_mod != "" && mod_name = class_mod),0) as class_bump,
@race_bump := IFNULL((select m.mod from faction_list_mod m where faction_id = f.id && race_mod != "" && mod_name = race_mod),0) as race_bump,
@deity_bump := IFNULL((select m.mod from faction_list_mod m where faction_id = f.id && race_mod != "" && mod_name = deity_mod),0) as deity_bump,
v.current_value + f.base + @class_bump + @race_bump + @deity_bump as TOTAL
FROM faction_values v
inner join faction_list f on f.id = v.faction_id
where v.char_id = (select id from character_data where name=charname) ;
END $$
DELIMITER ;
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,50 @@
-- Updates live pets who should be type (5) - Pet locks onto target until dead.
UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword99Rk3";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword99Rk2";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword99Rk1";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword94Rk3";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword94Rk2";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword94Rk1";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword89Rk3";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword89Rk2";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "WizSwarmSword89Rk1";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_84_Rk3";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_84_Rk2";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_84_Rk1";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_79_Rk3";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_79_Rk2";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_79_Rk1";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_74_";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_67_";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "SumSword";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "SUMHammer4";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "SUMHammer3";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "SUMHammer2";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "SUMHammer1";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "SumHammer";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "Burnout";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "SumSword";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "SumHammer";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_67_";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_73_";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_73_Rk1";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_73_Rk2";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_73_Rk3";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_78_Rk1";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_78_Rk2";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_78_Rk3";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_83_Rk1";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_83_Rk2";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_83_Rk3";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_84_Rk1";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_84_Rk2";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "wizard_sword_84_Rk3";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_88_Rk1";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_88_Rk2";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_88_Rk3";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_94_Rk1";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_94_Rk2";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_94_Rk3";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_99_Rk1";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_99_Rk2";
UPDATE pets SET petcontrol = 5 WHERE type LIKE "cleric_hammer_99_Rk3";
@@ -1,4 +1,5 @@
ALTER TABLE `npc_types` ADD COLUMN `special_abilities` TEXT NOT NULL DEFAULT '' AFTER `npcspecialattks`;
ALTER TABLE `npc_types` ADD COLUMN `special_abilities` TEXT NULL AFTER `npcspecialattks`;
ALTER TABLE `npc_types` MODIFY COLUMN `special_abilities` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL;
UPDATE npc_types SET special_abilities = CONCAT(special_abilities, "1,1^") WHERE npcspecialattks LIKE BINARY '%S%';
UPDATE npc_types SET special_abilities = CONCAT(special_abilities, "2,1^") WHERE npcspecialattks LIKE BINARY '%E%';
@@ -1,5 +1,6 @@
ALTER TABLE `merc_stats` ADD COLUMN `special_abilities` TEXT NOT NULL DEFAULT '' AFTER `specialattks`;
ALTER TABLE `merc_stats` ADD COLUMN `special_abilities` TEXT NULL AFTER `specialattks`;
ALTER TABLE `merc_stats` MODIFY COLUMN `special_abilities` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL;
UPDATE merc_stats SET special_abilities = CONCAT(special_abilities, "1,1^") WHERE specialattks LIKE BINARY '%S%';
UPDATE merc_stats SET special_abilities = CONCAT(special_abilities, "2,1^") WHERE specialattks LIKE BINARY '%E%';
UPDATE merc_stats SET special_abilities = CONCAT(special_abilities, "3,1^") WHERE specialattks LIKE BINARY '%R%';
@@ -1,34 +0,0 @@
-- AA MGB update
UPDATE altadv_vars SET spellid = 5228 WHERE skill_id = 128;
UPDATE aa_actions SET spell_id = 5228, nonspell_action = 0 WHERE aaid = 128;
-- AA Project Illusion update
UPDATE altadv_vars SET spellid = 5227 WHERE skill_id = 643;
UPDATE aa_actions SET spell_id = 5227, nonspell_action = 0 WHERE aaid = 643;
-- AA Improved Reclaim Energy
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('180', '1', '241', '95', '0');
-- AA Headshot
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('644', '1', '217', '0', '32000');
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('644', '2', '346', '46', '0');
-- AA Anatomy (Rogue Assassinate)
INSERT INTO `altadv_vars` (`skill_id`, `name`, `cost`, `max_level`, `hotkey_sid`, `hotkey_sid2`, `title_sid`, `desc_sid`, `type`, `spellid`, `prereq_skill`, `prereq_minpoints`, `spell_type`, `spell_refresh`, `classes`, `berserker`, `class_type`, `cost_inc`, `aa_expansion`, `special_category`, `sof_type`, `sof_cost_inc`, `sof_max_level`, `sof_next_skill`, `clientver`, `account_time_required`, `sof_current_level`,`sof_next_id`,`level_inc`) VALUES ('1604', 'Anatomy', '5', '3', '4294967295', '4294967295', '1604', '1604', '1', '4294967295', '0', '0', '0', '0', '512', '0', '60', '1', '10', '4294967295', '3', '0', '3', '1604', '1', '0', '0', '0', '0');
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('1604', '1', '439', '0', '32000');
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('1604', '2', '345', '48', '0');
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('1605', '1', '439', '0', '32000');
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('1605', '2', '345', '51', '0');
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('1606', '1', '439', '0', '32000');
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('1606', '2', '345', '53', '0');
-- AA Finishing Blow Fix
DELETE FROM aa_effects WHERE aaid = 199 AND slot = 2;
DELETE FROM aa_effects WHERE aaid = 200 AND slot = 2;
DELETE FROM aa_effects WHERE aaid = 201 AND slot = 2;
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('119', '1', '278', '500', '32000');
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('119', '2', '440', '50', '200');
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('120', '1', '278', '500', '32000');
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('120', '2', '440', '52', '200');
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('121', '1', '278', '500', '32000');
INSERT INTO `aa_effects` (`aaid`, `slot`, `effectid`, `base1`, `base2`) VALUES ('121', '2', '440', '54', '200');
@@ -1 +1 @@
ALTER TABLE `account` ADD COLUMN `ban_reason` TEXT NULL DEFAULT NULL AFTER `expansion`, ADD COLUMN `suspend_reason` TEXT NULL DEFAULT NULL AFTER `ban_reason`;
ALTER TABLE `account` ADD COLUMN `ban_reason` TEXT NULL DEFAULT NULL, ADD COLUMN `suspend_reason` TEXT NULL DEFAULT NULL AFTER `ban_reason`;
@@ -0,0 +1 @@
ALTER TABLE `raid_details` ADD `motd` varchar(1024);
@@ -0,0 +1,9 @@
CREATE TABLE `raid_leaders` (
`gid` int(4) unsigned NOT NULL,
`rid` int(4) unsigned NOT NULL,
`marknpc` varchar(64) NOT NULL,
`maintank` varchar(64) NOT NULL,
`assist` varchar(64) NOT NULL,
`puller` varchar(64) NOT NULL,
`leadershipaa` tinyblob NOT NULL
);
@@ -0,0 +1,2 @@
ALTER TABLE `group_leaders` ADD `mentoree` VARCHAR(64) NOT NULL;
ALTER TABLE `group_leaders` ADD `mentor_percent` INT(4) DEFAULT 0 NOT NULL;
@@ -0,0 +1,2 @@
ALTER TABLE `raid_leaders` ADD `mentoree` VARCHAR(64) NOT NULL;
ALTER TABLE `raid_leaders` ADD `mentor_percent` INT(4) DEFAULT 0 NOT NULL;
@@ -0,0 +1,4 @@
ALTER TABLE `merc_stats` MODIFY COLUMN `special_abilities` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL;
ALTER TABLE `npc_types` MODIFY COLUMN `special_abilities` text CHARACTER SET latin1 COLLATE latin1_swedish_ci NULL;
@@ -0,0 +1 @@
ALTER TABLE `raid_members` CHANGE COLUMN `groupid` `groupid` INT(4) UNSIGNED NOT NULL DEFAULT '0' AFTER `charid`;
@@ -0,0 +1,9 @@
-- spells new table update
ALTER TABLE `spells_new` CHANGE `field124` `disallow_sit` INT(11) NOT NULL DEFAULT '0';
ALTER TABLE `spells_new` CHANGE `field125` `deities0` INT(11) NOT NULL DEFAULT '0';
ALTER TABLE `spells_new` CHANGE `field196` `sneaking` INT(11) NOT NULL DEFAULT '0';
ALTER TABLE `spells_new` CHANGE `field158` `effectdescnum2` INT(11) NOT NULL DEFAULT '0';
ALTER TABLE `spells_new` CHANGE `field165` `ldon_trap` INT(11) NOT NULL DEFAULT '0';
ALTER TABLE `spells_new` CHANGE `field205` `no_block` INT(11) NOT NULL DEFAULT '0';
@@ -0,0 +1,4 @@
-- Inventory table update
ALTER TABLE `inventory`
ADD COLUMN `ornamenticon` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `custom_data`,
ADD COLUMN `ornamentidfile` INT(11) UNSIGNED NOT NULL DEFAULT '0' AFTER `ornamenticon`;
@@ -0,0 +1 @@
ALTER TABLE `mercs` ADD `MercSize` float( 0 ) NOT NULL DEFAULT '5' AFTER `Gender`;
@@ -0,0 +1 @@
ALTER TABLE `items` ADD `herosforgemodel` int( 11 ) NOT NULL DEFAULT '0' AFTER `material`;
@@ -0,0 +1 @@
ALTER TABLE `inventory` ADD `ornament_hero_model` int( 11 ) NOT NULL DEFAULT '0' AFTER `ornamentidfile`;
@@ -0,0 +1,16 @@
/* Add the new Aug Slot 6 Fields to the items table */
ALTER TABLE `items` ADD `augslot6type` tinyint( 3 ) NOT NULL DEFAULT '0' AFTER `augslot5visible`;
ALTER TABLE `items` ADD `augslot6visible` tinyint( 3 ) NOT NULL DEFAULT '0' AFTER `augslot6type`;
ALTER TABLE `items` ADD `augslot6unk2` int( 11 ) NOT NULL DEFAULT '0' AFTER `augslot5unk2`;
/* Add the new Aug Slot 6 Field to the inventory table */
ALTER TABLE `inventory` ADD `augslot6` mediumint( 7 ) NOT NULL DEFAULT '0' AFTER `augslot5`;
/* Add the new Aug Slot 6 Field to the sharedbank table */
ALTER TABLE `sharedbank` ADD `augslot6` mediumint( 7 ) NOT NULL DEFAULT '0' AFTER `augslot5`;
/* Add the new Aug Slot 6 Field to the object_contents table */
ALTER TABLE `object_contents` ADD `augslot6` mediumint( 7 ) NOT NULL DEFAULT '0' AFTER `augslot5`;
/* Add the new Aug Slot 6 Field to the sharedbank table */
ALTER TABLE `character_corpse_items` ADD `aug_6` int( 11 ) NOT NULL DEFAULT '0' AFTER `aug_5`;
@@ -0,0 +1 @@
ALTER TABLE `npc_types` ADD `herosforgemodel` int( 11 ) NOT NULL DEFAULT '0' AFTER `helmtexture`;
@@ -0,0 +1,2 @@
ALTER TABLE `npc_types` CHANGE `d_meele_texture1` `d_melee_texture1` INT(11) DEFAULT NULL;
ALTER TABLE `npc_types` CHANGE `d_meele_texture2` `d_melee_texture2` INT(11) DEFAULT NULL;
@@ -0,0 +1,69 @@
/* Drop the current Merc View */
DROP VIEW vwMercNpcTypes;
/* Rename fields to match the source changes */
ALTER TABLE `merc_weaponinfo` CHANGE `d_meele_texture1` `d_melee_texture1` INT(11) NOT NULL DEFAULT 0;
ALTER TABLE `merc_weaponinfo` CHANGE `d_meele_texture2` `d_melee_texture2` INT(11) NOT NULL DEFAULT 0;
/* Re-Create the Merc View with new field names */
CREATE VIEW vwMercNpcTypes AS
SELECT
ms.merc_npc_type_id,
'' AS name,
ms.clientlevel,
ms.level,
mtyp.race_id,
mstyp.class_id,
ms.hp,
ms.mana,
0 AS gender,
mai.texture,
mai.helmtexture,
ms.attack_speed,
ms.STR,
ms.STA,
ms.DEX,
ms.AGI,
ms._INT,
ms.WIS,
ms.CHA,
ms.MR,
ms.CR,
ms.DR,
ms.FR,
ms.PR,
ms.Corrup,
ms.mindmg,
ms.maxdmg,
ms.attack_count,
ms.special_abilities AS special_abilities,
mwi.d_melee_texture1,
mwi.d_melee_texture2,
mwi.prim_melee_type,
mwi.sec_melee_type,
ms.runspeed,
ms.hp_regen_rate,
ms.mana_regen_rate,
1 AS bodytype,
mai.armortint_id,
mai.armortint_red,
mai.armortint_green,
mai.armortint_blue,
ms.AC,
ms.ATK,
ms.Accuracy,
ms.spellscale,
ms.healscale
FROM merc_stats ms
INNER JOIN merc_armorinfo mai
ON ms.merc_npc_type_id = mai.merc_npc_type_id
AND mai.minlevel <= ms.level AND mai.maxlevel >= ms.level
INNER JOIN merc_weaponinfo mwi
ON ms.merc_npc_type_id = mwi.merc_npc_type_id
AND mwi.minlevel <= ms.level AND mwi.maxlevel >= ms.level
INNER JOIN merc_templates mtem
ON mtem.merc_npc_type_id = ms.merc_npc_type_id
INNER JOIN merc_types mtyp
ON mtem.merc_type_id = mtyp.merc_type_id
INNER JOIN merc_subtypes mstyp
ON mtem.merc_subtype_id = mstyp.merc_subtype_id;
@@ -0,0 +1,3 @@
ALTER TABLE `npc_types` MODIFY `bodytype` INT(11) NOT NULL DEFAULT '1';
ALTER TABLE `npc_types` MODIFY `d_melee_texture1` INT(11) NOT NULL DEFAULT '0';
ALTER TABLE `npc_types` MODIFY `d_melee_texture2` INT(11) NOT NULL DEFAULT '0';
@@ -0,0 +1,54 @@
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for logsys_categories
-- ----------------------------
DROP TABLE IF EXISTS `logsys_categories`;
CREATE TABLE `logsys_categories` (
`log_category_id` int(11) NOT NULL,
`log_category_description` varchar(150) DEFAULT NULL,
`log_to_console` smallint(11) DEFAULT '0',
`log_to_file` smallint(11) DEFAULT '0',
`log_to_gmsay` smallint(11) DEFAULT '0',
PRIMARY KEY (`log_category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- ----------------------------
-- Records of logsys_categories
-- ----------------------------
INSERT INTO `logsys_categories` VALUES ('1', 'AA', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('2', 'AI', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('3', 'Aggro', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('4', 'Attack', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('5', 'Client_Server_Packet', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('6', 'Combat', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('7', 'Commands', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('8', 'Crash', '1', '1', '0');
INSERT INTO `logsys_categories` VALUES ('9', 'Debug', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('10', 'Doors', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('11', 'Error', '1', '1', '0');
INSERT INTO `logsys_categories` VALUES ('12', 'Guilds', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('13', 'Inventory', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('14', 'Launcher', '1', '1', '0');
INSERT INTO `logsys_categories` VALUES ('15', 'Netcode', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('16', 'Normal', '1', '1', '0');
INSERT INTO `logsys_categories` VALUES ('17', 'Object', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('18', 'Pathing', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('19', 'QS_Server', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('20', 'Quests', '1', '1', '0');
INSERT INTO `logsys_categories` VALUES ('21', 'Rules', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('22', 'Skills', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('23', 'Spawns', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('24', 'Spells', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('25', 'Status', '1', '1', '0');
INSERT INTO `logsys_categories` VALUES ('26', 'TCP_Connection', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('27', 'Tasks', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('28', 'Tradeskills', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('29', 'Trading', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('30', 'Tribute', '0', '0', '0');
INSERT INTO `logsys_categories` VALUES ('31', 'UCS_Server', '1', '1', '0');
INSERT INTO `logsys_categories` VALUES ('32', 'WebInterface_Server', '1', '1', '0');
INSERT INTO `logsys_categories` VALUES ('33', 'World_Server', '1', '1', '0');
INSERT INTO `logsys_categories` VALUES ('34', 'Zone Server', '1', '1', '0');
INSERT INTO `logsys_categories` VALUES ('35', 'MySQL Error', '1', '1', '1');
INSERT INTO `logsys_categories` VALUES ('36', 'MySQL Queries', '0', '0', '0');
@@ -0,0 +1 @@
ALTER TABLE `npc_types` ADD `light` tinyint( 2 ) NOT NULL DEFAULT '0';
@@ -0,0 +1 @@
INSERT INTO `logsys_categories` (`log_category_id`,`log_category_description`,`log_to_console`,`log_to_file`,`log_to_gmsay`) VALUES ('37', 'Mercenaries', '0', '0', '0');
@@ -0,0 +1 @@
INSERT INTO `logsys_categories` (`log_category_id`, `log_category_description`, `log_to_gmsay`) VALUES ('38', 'Quest Debug', '1');
@@ -0,0 +1 @@
ALTER TABLE `merc_stats` ADD `statscale` int( 11 ) NOT NULL DEFAULT '100' AFTER `runspeed`;
@@ -0,0 +1,3 @@
ALTER TABLE `merc_stats` ADD `attack_delay` TINYINT(3) UNSIGNED DEFAULT '30' NOT NULL AFTER `attack_speed`;
UPDATE `merc_stats` SET `attack_delay` = 36 + 36 * (`attack_speed` / 100);
UPDATE `merc_stats` SET `attack_delay` = 30 WHERE `attack_speed` = 0;
@@ -0,0 +1,7 @@
CREATE TABLE `character_item_recast` (
`id` int(11) UNSIGNED NOT NULL DEFAULT 0,
`recast_type` smallint(11) UNSIGNED NOT NULL DEFAULT 0,
`timestamp` int(11) UNSIGNED NOT NULL DEFAULT 0,
PRIMARY KEY(`id`, `recast_type`),
KEY `id` (`id`)
) ENGINE = InnoDB DEFAULT CHARSET = latin1;
@@ -0,0 +1,3 @@
REPLACE INTO `logsys_categories` (`log_category_id`, `log_category_description`) VALUES ('39', 'Packet: Server -> Client');
REPLACE INTO `logsys_categories` (`log_category_id`, `log_category_description`) VALUES ('5', 'Packet: Client -> Server');
REPLACE INTO `logsys_categories` (`log_category_id`, `log_category_description`) VALUES ('40', 'Packet: Client -> Server Unhandled');
@@ -0,0 +1,2 @@
REPLACE INTO `logsys_categories` (`log_category_id`, `log_category_description`) VALUES ('41', 'Packet: Server -> Client With Dump');
REPLACE INTO `logsys_categories` (`log_category_id`, `log_category_description`) VALUES ('42', 'Packet: Server -> Client With Dump');
@@ -0,0 +1,2 @@
ALTER TABLE `loottable` CHANGE COLUMN `avgcoin` `avgcoin` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `maxcash`;
UPDATE `loottable` SET avgcoin = 0;
File diff suppressed because one or more lines are too long