/*
EQ2Emulator: Everquest II Server Emulator
Copyright (C) 2007 EQ2EMulator Development Team (http://www.eq2emulator.net)
This file is part of EQ2Emulator.
EQ2Emulator is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
EQ2Emulator is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with EQ2Emulator. If not, see .
*/
#ifndef __EQ2_DATABUFFER_
#define __EQ2_DATABUFFER_
#include
#include "../common/types.h"
#include "../common/EQPacket.h"
#include "../common/EQ2_Common_Structs.h"
#ifdef WORLD
#include "../WorldServer/SpawnLists.h"
#endif
using namespace std;
class DataBuffer{
public:
bool changed;
uchar* getData(){ return (uchar*)buffer.c_str(); }
int32 getDataSize(){ return buffer.length(); }
string* getDataString(){ return &buffer; }
void CreateEQ2Color(EQ2_Color& color){
CreateEQ2Color(&color);
}
uchar* GetLoadBuffer(){
return load_buffer;
}
int32 GetLoadPos(){
return load_pos;
}
int32 GetLoadLen(){
return load_len;
}
void SetLoadPos(int32 new_pos){
load_pos = new_pos;
}
void CreateEQ2Color(EQ2_Color* color){
int8 rgb[3];
float* tmp = 0;
for(int i=0;i<3;i++){
tmp = (float*)(load_buffer + load_pos);
rgb[i] = (int8)((*tmp)*255);
load_pos += sizeof(float);
}
color->red = rgb[0];
color->green = rgb[1];
color->blue = rgb[2];
}
template void MakeEQ2_Int8(Type& output){
MakeEQ2_Int8(&output);
}
template void MakeEQ2_Int8(Type* output){
float* tmp = (float*)(load_buffer + load_pos);
if(*tmp < 0)
*tmp *= -1;
sint8 result = (sint8)((*tmp)*100);
memcpy(output, &result, sizeof(sint8));
load_pos += sizeof(float);
}
void InitializeGetData(){
get_buffer = (uchar*)buffer.c_str();
get_len = buffer.length();
get_pos = 0;
}
void InitializeLoadData(uchar* input, int32 size){
buffer = string((char*)input, size);
load_buffer = (uchar*)buffer.c_str();
load_len = size;
load_pos = 0;
}
template void LoadDataString(String& output){
LoadDataString(&output);
}
template void LoadDataString(String* output){
if((sizeof(output->size) + load_pos) <= load_len){
memcpy(&output->size, load_buffer + load_pos, sizeof(output->size));
load_pos += sizeof(output->size);
}
if((output->size + load_pos) <= load_len){
output->data = string((char*)(load_buffer + load_pos), output->size);
load_pos += output->size;
}
}
template void LoadData(Type& output){
LoadData(&output);
}
template void LoadData(Type* output, int32 array_size){
if(array_size<=1){
LoadData(output);
}
else{
for(int32 i=0;i void LoadData(Type* output){
if((sizeof(Type) + load_pos) <= load_len){
memcpy(output, load_buffer + load_pos, sizeof(Type));
load_pos += sizeof(Type);
}
}
template void LoadData(Type& output, int32 array_size){
LoadData(&output, array_size);
}
void LoadSkip(int8 bytes){
load_pos += bytes;
}
template void LoadSkip(Type& skip){
LoadSkip(&skip);
}
template void LoadSkip(Type* skip){
load_pos += sizeof(Type);
}
template void GetData(Type* output){
if((sizeof(Type) + get_pos) <= get_len){
*output = (Type*)get_buffer;
get_pos += sizeof(output);
}
}
void AddZeros(int16 num){
int8* data = new int8[num];
memset(data, 0, num);
AddData(*data);
safe_delete_array(data);
}
template void StructAddData(Type input, int16 size, string* datastring){
if(datastring)
datastring->append((char*)&input, size);
else
buffer.append((char*)&input, size);
}
template void StructAddData(Type input, int32 array_size, int16 size, string* datastring){
if(array_size>0){
for(int32 i=0;i void AddData(Type input, string* datastring = 0){
if(!datastring)
datastring = &buffer;
datastring->append((char*)&input, sizeof(input));
}
template void AddData(Type input, int32 array_size, string* datastring = 0){
if(array_size>0){
for(int32 i=0;i void AddDataString(String* input, string* datastring = 0){
AddDataString(*input, datastring);
}
template void AddDataString(String input, string* datastring = 0){
input.size = input.data.length();
if(!datastring)
datastring = &buffer;
datastring->append((char*)&input.size, sizeof(input.size));
datastring->append(input.data);
}
void AddCharArray(char* array, string* datastring = 0){
if(!datastring)
datastring = &buffer;
datastring->append(array);
}
void AddCharArray(char* array, int16 size, string* datastring = 0){
if(!datastring)
datastring = &buffer;
datastring->append(array, size);
}
void AddData(string data, string* datastring = 0){
if(!datastring)
datastring = &buffer;
datastring->append(data);
}
void Clear() { buffer.clear(); }
private:
string buffer;
uchar* get_buffer;
uchar* load_buffer;
int32 get_len;
int32 get_pos;
int32 load_len;
int32 load_pos;
};
#endif