move datmanager to thingstype
This commit is contained in:
parent
427dd91d79
commit
e69a6d1140
|
@ -58,7 +58,7 @@ SET(SOURCES
|
||||||
# otclient core
|
# otclient core
|
||||||
src/otclient/core/game.cpp
|
src/otclient/core/game.cpp
|
||||||
src/otclient/core/map.cpp
|
src/otclient/core/map.cpp
|
||||||
src/otclient/core/datmanager.cpp
|
src/otclient/core/thingstype.cpp
|
||||||
src/otclient/core/spritemanager.cpp
|
src/otclient/core/spritemanager.cpp
|
||||||
src/otclient/core/item.cpp
|
src/otclient/core/item.cpp
|
||||||
src/otclient/core/tile.cpp
|
src/otclient/core/tile.cpp
|
||||||
|
|
|
@ -528,7 +528,7 @@ bool Platform::createWindow(int x, int y, int width, int height, int minWidth, i
|
||||||
x11.visual->visual,
|
x11.visual->visual,
|
||||||
AllocNone);
|
AllocNone);
|
||||||
|
|
||||||
// setup window attributes
|
// setup window type
|
||||||
XSetWindowAttributes wa;
|
XSetWindowAttributes wa;
|
||||||
wa.colormap = x11.colormap;
|
wa.colormap = x11.colormap;
|
||||||
wa.border_pixel = 0;
|
wa.border_pixel = 0;
|
||||||
|
|
|
@ -80,24 +80,6 @@ namespace Otc
|
||||||
LastDatFlag = 255
|
LastDatFlag = 255
|
||||||
};
|
};
|
||||||
|
|
||||||
enum ThingAttributesGroup {
|
|
||||||
ThingNoGroup = 0,
|
|
||||||
ThingGroundGroup,
|
|
||||||
ThingContainerGroup,
|
|
||||||
ThingWeaponGroup,
|
|
||||||
ThingAmmunitionGroup,
|
|
||||||
ThingArmorGroup,
|
|
||||||
ThingRuneGroup,
|
|
||||||
ThingTeleportGroup,
|
|
||||||
ThingMagicFieldGroup,
|
|
||||||
ThingWriteableGroup,
|
|
||||||
ThingKeyGroup,
|
|
||||||
ThingSplashGroup,
|
|
||||||
ThingFluidGroup,
|
|
||||||
ThingDoorGroup,
|
|
||||||
ThingLastGroup
|
|
||||||
};
|
|
||||||
|
|
||||||
enum ThingType {
|
enum ThingType {
|
||||||
Item,
|
Item,
|
||||||
Creature,
|
Creature,
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "creature.h"
|
#include "creature.h"
|
||||||
#include "datmanager.h"
|
#include "thingstype.h"
|
||||||
#include "localplayer.h"
|
#include "localplayer.h"
|
||||||
#include "map.h"
|
#include "map.h"
|
||||||
#include <framework/platform/platform.h>
|
#include <framework/platform/platform.h>
|
||||||
|
@ -68,10 +68,10 @@ void Creature::draw(int x, int y)
|
||||||
x += m_walkOffsetX;
|
x += m_walkOffsetX;
|
||||||
y += m_walkOffsetY;
|
y += m_walkOffsetY;
|
||||||
|
|
||||||
const ThingAttributes& attributes = getAttributes();
|
const ThingType& type = getType();
|
||||||
|
|
||||||
// Render creature
|
// Render creature
|
||||||
for(m_yPattern = 0; m_yPattern < attributes.yPattern; m_yPattern++) {
|
for(m_yPattern = 0; m_yPattern < type.yPattern; m_yPattern++) {
|
||||||
|
|
||||||
// continue if we dont have this addon.
|
// continue if we dont have this addon.
|
||||||
if(m_yPattern > 0 && !(m_outfit.addons & (1 << (m_yPattern-1))))
|
if(m_yPattern > 0 && !(m_outfit.addons & (1 << (m_yPattern-1))))
|
||||||
|
@ -81,7 +81,7 @@ void Creature::draw(int x, int y)
|
||||||
internalDraw(x, y, 0);
|
internalDraw(x, y, 0);
|
||||||
|
|
||||||
// draw mask if exists
|
// draw mask if exists
|
||||||
if(attributes.layers > 1) {
|
if(type.layers > 1) {
|
||||||
// switch to blend color mode
|
// switch to blend color mode
|
||||||
g_graphics.bindBlendFunc(Fw::BlendColorzing);
|
g_graphics.bindBlendFunc(Fw::BlendColorzing);
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ void Creature::draw(int x, int y)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update animation and position
|
// Update animation and position
|
||||||
if(m_walking && attributes.animationPhases > 1) {
|
if(m_walking && type.animationPhases > 1) {
|
||||||
|
|
||||||
if(g_platform.getTicks() - m_lastTicks >= m_walkTimePerPixel) {
|
if(g_platform.getTicks() - m_lastTicks >= m_walkTimePerPixel) {
|
||||||
int pixelsWalked = std::floor((g_platform.getTicks() - m_lastTicks) / m_walkTimePerPixel);
|
int pixelsWalked = std::floor((g_platform.getTicks() - m_lastTicks) / m_walkTimePerPixel);
|
||||||
|
@ -125,8 +125,8 @@ void Creature::draw(int x, int y)
|
||||||
m_walkOffsetX = std::max(m_walkOffsetX - pixelsWalked, 0);
|
m_walkOffsetX = std::max(m_walkOffsetX - pixelsWalked, 0);
|
||||||
|
|
||||||
int walkOffset = std::max(std::abs(m_walkOffsetX), std::abs(m_walkOffsetY));
|
int walkOffset = std::max(std::abs(m_walkOffsetX), std::abs(m_walkOffsetY));
|
||||||
if(walkOffset % (int)std::ceil(32 / (float)attributes.animationPhases) == 0) {
|
if(walkOffset % (int)std::ceil(32 / (float)type.animationPhases) == 0) {
|
||||||
if((m_animation+1) % attributes.animationPhases == 0)
|
if((m_animation+1) % type.animationPhases == 0)
|
||||||
m_animation = 1;
|
m_animation = 1;
|
||||||
else
|
else
|
||||||
m_animation++;
|
m_animation++;
|
||||||
|
@ -239,7 +239,7 @@ void Creature::walk(const Position& position)
|
||||||
|
|
||||||
ThingPtr ground = g_map.getThing(m_position, 0);
|
ThingPtr ground = g_map.getThing(m_position, 0);
|
||||||
if(ground)
|
if(ground)
|
||||||
groundSpeed = ground->getAttributes().groundSpeed;
|
groundSpeed = ground->getType().groundSpeed;
|
||||||
|
|
||||||
float walkTime = walkTimeFactor * 1000.0 * (float)groundSpeed / m_speed;
|
float walkTime = walkTimeFactor * 1000.0 * (float)groundSpeed / m_speed;
|
||||||
walkTime = walkTime == 0 ? 1000 : walkTime;
|
walkTime = walkTime == 0 ? 1000 : walkTime;
|
||||||
|
@ -266,9 +266,9 @@ void Creature::setHealthPercent(uint8 healthPercent)
|
||||||
onHealthPercentChange(oldHealthPercent);
|
onHealthPercentChange(oldHealthPercent);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ThingAttributes& Creature::getAttributes()
|
const ThingType& Creature::getType()
|
||||||
{
|
{
|
||||||
return g_dat.getCreatureAttributes(m_outfit.type);
|
return g_thingsType.getCreatureType(m_outfit.type);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Creature::onHealthPercentChange(int)
|
void Creature::onHealthPercentChange(int)
|
||||||
|
|
|
@ -66,7 +66,7 @@ public:
|
||||||
uint8 getShield() { return m_shield; }
|
uint8 getShield() { return m_shield; }
|
||||||
uint8 getEmblem() { return m_emblem; }
|
uint8 getEmblem() { return m_emblem; }
|
||||||
bool getImpassable() { return m_impassable; }
|
bool getImpassable() { return m_impassable; }
|
||||||
const ThingAttributes& getAttributes();
|
const ThingType& getType();
|
||||||
|
|
||||||
void onHealthPercentChange(int);
|
void onHealthPercentChange(int);
|
||||||
|
|
||||||
|
|
|
@ -1,227 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2010-2011 OTClient <https://github.com/edubart/otclient>
|
|
||||||
*
|
|
||||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
* of this software and associated documentation files (the "Software"), to deal
|
|
||||||
* in the Software without restriction, including without limitation the rights
|
|
||||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
* copies of the Software, and to permit persons to whom the Software is
|
|
||||||
* furnished to do so, subject to the following conditions:
|
|
||||||
*
|
|
||||||
* The above copyright notice and this permission notice shall be included in
|
|
||||||
* all copies or substantial portions of the Software.
|
|
||||||
*
|
|
||||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
* THE SOFTWARE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "datmanager.h"
|
|
||||||
#include "spritemanager.h"
|
|
||||||
#include "thing.h"
|
|
||||||
#include <framework/core/resourcemanager.h>
|
|
||||||
|
|
||||||
DatManager g_dat;
|
|
||||||
|
|
||||||
bool DatManager::load(const std::string& file)
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
std::stringstream fin;
|
|
||||||
g_resources.loadFile(file, fin);
|
|
||||||
|
|
||||||
m_signature = Fw::getU32(fin);
|
|
||||||
int numItems = Fw::getU16(fin);
|
|
||||||
int numCreatures = Fw::getU16(fin);
|
|
||||||
int numEffects = Fw::getU16(fin);
|
|
||||||
int numShots = Fw::getU16(fin);
|
|
||||||
|
|
||||||
m_itemsAttributes.resize(numItems);
|
|
||||||
for(int id = 100; id < numItems; ++id)
|
|
||||||
parseThingAttributes(fin, m_itemsAttributes[id - 100]);
|
|
||||||
|
|
||||||
m_creaturesAttributes.resize(numItems);
|
|
||||||
for(int id = 0; id < numCreatures; ++id)
|
|
||||||
parseThingAttributes(fin, m_creaturesAttributes[id]);
|
|
||||||
|
|
||||||
m_effectsAttributes.resize(numItems);
|
|
||||||
for(int id = 0; id < numEffects; ++id)
|
|
||||||
parseThingAttributes(fin, m_effectsAttributes[id]);
|
|
||||||
|
|
||||||
m_shotsAttributes.resize(numItems);
|
|
||||||
for(int id = 0; id < numShots; ++id)
|
|
||||||
parseThingAttributes(fin, m_shotsAttributes[id]);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
} catch(std::exception& e) {
|
|
||||||
logError("failed to load dat from '", file, "': ", e.what());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatManager::unload()
|
|
||||||
{
|
|
||||||
m_itemsAttributes.clear();
|
|
||||||
m_creaturesAttributes.clear();
|
|
||||||
m_effectsAttributes.clear();
|
|
||||||
m_shotsAttributes.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatManager::parseThingAttributes(std::stringstream& fin, ThingAttributes& thingAttributes)
|
|
||||||
{
|
|
||||||
assert(fin.good());
|
|
||||||
|
|
||||||
while(true) {
|
|
||||||
uint8 opt;
|
|
||||||
fin.read((char*)&opt, 1);
|
|
||||||
|
|
||||||
if(opt == Otc::LastDatFlag)
|
|
||||||
break;
|
|
||||||
|
|
||||||
parseThingAttributesOpt(fin, thingAttributes, opt);
|
|
||||||
}
|
|
||||||
|
|
||||||
thingAttributes.width = Fw::getU8(fin);
|
|
||||||
thingAttributes.height = Fw::getU8(fin);
|
|
||||||
|
|
||||||
if(thingAttributes.width > 1 || thingAttributes.height > 1)
|
|
||||||
thingAttributes.exactSize = Fw::getU8(fin);
|
|
||||||
else
|
|
||||||
thingAttributes.exactSize = 32;
|
|
||||||
|
|
||||||
thingAttributes.layers = Fw::getU8(fin);
|
|
||||||
thingAttributes.xPattern = Fw::getU8(fin);
|
|
||||||
thingAttributes.yPattern = Fw::getU8(fin);
|
|
||||||
thingAttributes.zPattern = Fw::getU8(fin);
|
|
||||||
thingAttributes.animationPhases = Fw::getU8(fin);
|
|
||||||
|
|
||||||
int totalSprites = thingAttributes.width
|
|
||||||
* thingAttributes.height
|
|
||||||
* thingAttributes.layers
|
|
||||||
* thingAttributes.xPattern
|
|
||||||
* thingAttributes.yPattern
|
|
||||||
* thingAttributes.zPattern
|
|
||||||
* thingAttributes.animationPhases;
|
|
||||||
|
|
||||||
thingAttributes.sprites.resize(totalSprites);
|
|
||||||
for(uint16 i = 0; i < totalSprites; i++)
|
|
||||||
thingAttributes.sprites[i] = Fw::getU16(fin);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatManager::parseThingAttributesOpt(std::stringstream& fin, ThingAttributes& thingAttributes, uint8 opt)
|
|
||||||
{
|
|
||||||
switch(opt) {
|
|
||||||
case Otc::DatGround: // Grounds, must be drawn first
|
|
||||||
thingAttributes.groundSpeed = Fw::getU16(fin);
|
|
||||||
thingAttributes.isGround = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatGroundClip: // Objects that clips (has transparent pixels) and must be drawn just after ground (e.g: ground borders)
|
|
||||||
thingAttributes.isGroundClip = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatOnBottom: // Bottom items, must be drawn above general items and below creatures (e.g: stairs)
|
|
||||||
thingAttributes.isOnBottom = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatOnTop: // Top items, must be drawn above creatures (e.g: doors)
|
|
||||||
thingAttributes.isOnTop = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatContainer: // Containers
|
|
||||||
thingAttributes.isContainer = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatStackable: // Stackable
|
|
||||||
thingAttributes.isStackable = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatForceUse: // Items that are automatically used when step over?
|
|
||||||
thingAttributes.isForceUse = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatMultiUse: // Usable items
|
|
||||||
thingAttributes.isMultiUse = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatWritable: // Writable
|
|
||||||
thingAttributes.isWritable = true;
|
|
||||||
thingAttributes.maxTextLength = Fw::getU16(fin);
|
|
||||||
break;
|
|
||||||
case Otc::DatWritableOnce: // Writable once. objects that can't be edited by players
|
|
||||||
thingAttributes.isWritableOnce = true;
|
|
||||||
thingAttributes.maxTextLength = Fw::getU16(fin);
|
|
||||||
break;
|
|
||||||
case Otc::DatFluidContainer: // Fluid containers
|
|
||||||
thingAttributes.fluidParam = Fw::getU8(fin);
|
|
||||||
break;
|
|
||||||
case Otc::DatSplash: // Splashes
|
|
||||||
thingAttributes.isStackable = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatBlockWalk: // Blocks solid objects (creatures, walls etc)
|
|
||||||
thingAttributes.isNotWalkable = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatNotMovable: // Not movable
|
|
||||||
thingAttributes.isNotMoveable = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatBlockProjectile: // Blocks missiles (walls, magic wall etc)
|
|
||||||
thingAttributes.isNotProjectable = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatBlockPathFind: // Blocks pathfind algorithms (monsters)
|
|
||||||
thingAttributes.isNotPathable = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatPickupable: // Pickupable
|
|
||||||
thingAttributes.isPickupable = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatHangable: // Hangable objects (wallpaper etc)
|
|
||||||
thingAttributes.isHangable = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatHookSouth: // Horizontal walls
|
|
||||||
thingAttributes.isHookSouth = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatHookEast: // Vertical walls
|
|
||||||
thingAttributes.isHookEast = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatRotable: // Rotable
|
|
||||||
thingAttributes.isRotable = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatLight: // Light info
|
|
||||||
thingAttributes.hasLight = true;
|
|
||||||
thingAttributes.lightLevel = Fw::getU16(fin);
|
|
||||||
thingAttributes.lightColor = Fw::getU16(fin);
|
|
||||||
break;
|
|
||||||
case Otc::DatDontHide: // A few monuments that are not supposed to be hidden by floors
|
|
||||||
break;
|
|
||||||
case Otc::DatTranslucent: // Grounds that are translucent
|
|
||||||
thingAttributes.isTranslucent = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatDisplacment: // Must shift draw
|
|
||||||
thingAttributes.xDisplacment = Fw::getU16(fin);
|
|
||||||
thingAttributes.yDisplacment = Fw::getU16(fin);
|
|
||||||
break;
|
|
||||||
case Otc::DatElevation: // Must elevate draw
|
|
||||||
thingAttributes.elevation = Fw::getU16(fin);
|
|
||||||
break;
|
|
||||||
case Otc::DatLyingCorpse: // Some corpses
|
|
||||||
thingAttributes.isLyingCorpse = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatAnimateAlways: // Unknown, check if firesword is a kind of AnimateAlways.
|
|
||||||
thingAttributes.isAnimatedAlways = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatMinimapColor: // Minimap color
|
|
||||||
thingAttributes.hasMiniMapColor = true;
|
|
||||||
thingAttributes.miniMapColor = Fw::getU16(fin);
|
|
||||||
break;
|
|
||||||
case Otc::DatLensHelp: // Used for giving players tips?
|
|
||||||
thingAttributes.isLensHelp = true;
|
|
||||||
thingAttributes.lensHelpParam = Fw::getU16(fin);
|
|
||||||
break;
|
|
||||||
case Otc::DatFullGround: // Grounds that has no transparent pixels
|
|
||||||
thingAttributes.isFullGround = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatIgnoreLook: // Ignore look, then looks at the item on the bottom of it
|
|
||||||
thingAttributes.isIgnoreLook = true;
|
|
||||||
break;
|
|
||||||
case Otc::DatClothe: // Clothes
|
|
||||||
break;
|
|
||||||
case Otc::DatAnimation: // Not used in 8.62
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
throw std::runtime_error(Fw::mkstr("unknown .dat byte code: ", (int)opt));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -21,7 +21,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "effect.h"
|
#include "effect.h"
|
||||||
#include "datmanager.h"
|
#include "thingstype.h"
|
||||||
#include "map.h"
|
#include "map.h"
|
||||||
#include <framework/platform/platform.h>
|
#include <framework/platform/platform.h>
|
||||||
#include <framework/core/eventdispatcher.h>
|
#include <framework/core/eventdispatcher.h>
|
||||||
|
@ -36,8 +36,8 @@ void Effect::draw(int x, int y)
|
||||||
{
|
{
|
||||||
if(!m_finished) {
|
if(!m_finished) {
|
||||||
if(g_platform.getTicks() - m_lastTicks > 75) {
|
if(g_platform.getTicks() - m_lastTicks > 75) {
|
||||||
const ThingAttributes& attributes = getAttributes();
|
const ThingType& type = getType();
|
||||||
if(m_animation+1 == attributes.animationPhases) {
|
if(m_animation+1 == type.animationPhases) {
|
||||||
g_dispatcher.addEvent(std::bind(&Map::removeThingByPtr, &g_map, asThing()));
|
g_dispatcher.addEvent(std::bind(&Map::removeThingByPtr, &g_map, asThing()));
|
||||||
m_finished = true;
|
m_finished = true;
|
||||||
}
|
}
|
||||||
|
@ -50,7 +50,7 @@ void Effect::draw(int x, int y)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const ThingAttributes& Effect::getAttributes()
|
const ThingType& Effect::getType()
|
||||||
{
|
{
|
||||||
return g_dat.getEffectAttributes(m_id);
|
return g_thingsType.getEffectType(m_id);
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,7 +35,7 @@ public:
|
||||||
|
|
||||||
bool finished() { return m_finished; }
|
bool finished() { return m_finished; }
|
||||||
|
|
||||||
const ThingAttributes& getAttributes();
|
const ThingType& getType();
|
||||||
|
|
||||||
EffectPtr asEffect() { return std::static_pointer_cast<Effect>(shared_from_this()); }
|
EffectPtr asEffect() { return std::static_pointer_cast<Effect>(shared_from_this()); }
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "item.h"
|
#include "item.h"
|
||||||
#include "datmanager.h"
|
#include "thingstype.h"
|
||||||
#include "spritemanager.h"
|
#include "spritemanager.h"
|
||||||
#include "thing.h"
|
#include "thing.h"
|
||||||
#include <framework/platform/platform.h>
|
#include <framework/platform/platform.h>
|
||||||
|
@ -34,21 +34,21 @@ Item::Item() : Thing(Otc::Item)
|
||||||
|
|
||||||
void Item::draw(int x, int y)
|
void Item::draw(int x, int y)
|
||||||
{
|
{
|
||||||
const ThingAttributes& attributes = g_dat.getItemAttributes(m_id);
|
const ThingType& type = g_thingsType.getItemType(m_id);
|
||||||
|
|
||||||
if(attributes.animationPhases > 1) {
|
if(type.animationPhases > 1) {
|
||||||
if(g_platform.getTicks() - m_lastTicks > 500) {
|
if(g_platform.getTicks() - m_lastTicks > 500) {
|
||||||
m_animation++;
|
m_animation++;
|
||||||
m_lastTicks = g_platform.getTicks();
|
m_lastTicks = g_platform.getTicks();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*if(attributes.group == Otc::ThingSplashGroup || attributes.group == Otc::ThingFluidGroup) {
|
/*if(type.group == Otc::ThingSplashGroup || type.group == Otc::ThingFluidGroup) {
|
||||||
//xPattern = m_count % attributes.xPattern;
|
//xPattern = m_count % type.xPattern;
|
||||||
//yPattern = m_count / attributes.yPattern;
|
//yPattern = m_count / type.yPattern;
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
for(int b = 0; b < attributes.layers; b++)
|
for(int b = 0; b < type.layers; b++)
|
||||||
internalDraw(x, y, b);
|
internalDraw(x, y, b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,27 +59,27 @@ void Item::setCount(int count)
|
||||||
onCountChange(oldCount);
|
onCountChange(oldCount);
|
||||||
}
|
}
|
||||||
|
|
||||||
const ThingAttributes& Item::getAttributes()
|
const ThingType& Item::getType()
|
||||||
{
|
{
|
||||||
return g_dat.getItemAttributes(m_id);
|
return g_thingsType.getItemType(m_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::onPositionChange(const Position&)
|
void Item::onPositionChange(const Position&)
|
||||||
{
|
{
|
||||||
const ThingAttributes& attributes = g_dat.getItemAttributes(m_id);
|
const ThingType& type = g_thingsType.getItemType(m_id);
|
||||||
|
|
||||||
if(attributes.isNotMoveable) {
|
if(type.isNotMoveable) {
|
||||||
m_xPattern = m_position.x % attributes.xPattern;
|
m_xPattern = m_position.x % type.xPattern;
|
||||||
m_yPattern = m_position.y % attributes.yPattern;
|
m_yPattern = m_position.y % type.yPattern;
|
||||||
m_zPattern = m_position.z % attributes.zPattern;
|
m_zPattern = m_position.z % type.zPattern;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Item::onCountChange(int)
|
void Item::onCountChange(int)
|
||||||
{
|
{
|
||||||
const ThingAttributes& attributes = g_dat.getItemAttributes(m_id);
|
const ThingType& type = g_thingsType.getItemType(m_id);
|
||||||
|
|
||||||
if(attributes.isStackable && attributes.xPattern == 4 && attributes.yPattern == 2) {
|
if(type.isStackable && type.xPattern == 4 && type.yPattern == 2) {
|
||||||
if(m_count < 5) {
|
if(m_count < 5) {
|
||||||
m_xPattern = m_count-1;
|
m_xPattern = m_count-1;
|
||||||
m_yPattern = 0;
|
m_yPattern = 0;
|
||||||
|
|
|
@ -36,7 +36,7 @@ public:
|
||||||
void setCount(int count);
|
void setCount(int count);
|
||||||
|
|
||||||
int getCount() { return m_count; }
|
int getCount() { return m_count; }
|
||||||
const ThingAttributes& getAttributes();
|
const ThingType& getType();
|
||||||
|
|
||||||
void onPositionChange(const Position&);
|
void onPositionChange(const Position&);
|
||||||
void onCountChange(int);
|
void onCountChange(int);
|
||||||
|
|
|
@ -42,7 +42,7 @@ void Thing::setPosition(const Position& position)
|
||||||
|
|
||||||
void Thing::internalDraw(int x, int y, int layers, Otc::SpriteMask mask)
|
void Thing::internalDraw(int x, int y, int layers, Otc::SpriteMask mask)
|
||||||
{
|
{
|
||||||
const ThingAttributes& type = getAttributes();
|
const ThingType& type = getType();
|
||||||
|
|
||||||
for(int yi = 0; yi < type.height; yi++) {
|
for(int yi = 0; yi < type.height; yi++) {
|
||||||
for(int xi = 0; xi < type.width; xi++) {
|
for(int xi = 0; xi < type.width; xi++) {
|
||||||
|
|
|
@ -24,7 +24,7 @@
|
||||||
#define THING_H
|
#define THING_H
|
||||||
|
|
||||||
#include "declarations.h"
|
#include "declarations.h"
|
||||||
#include "thingattributes.h"
|
#include "thingtype.h"
|
||||||
#include <framework/luascript/luaobject.h>
|
#include <framework/luascript/luaobject.h>
|
||||||
|
|
||||||
struct Light
|
struct Light
|
||||||
|
@ -47,7 +47,7 @@ public:
|
||||||
uint32 getId() const { return m_id; }
|
uint32 getId() const { return m_id; }
|
||||||
Otc::ThingType getType() const { return m_type; }
|
Otc::ThingType getType() const { return m_type; }
|
||||||
Position getPosition() const { return m_position; }
|
Position getPosition() const { return m_position; }
|
||||||
virtual const ThingAttributes& getAttributes() = 0;
|
virtual const ThingType& getType() = 0;
|
||||||
|
|
||||||
virtual void onPositionChange(const Position&) {}
|
virtual void onPositionChange(const Position&) {}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,222 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2011 OTClient <https://github.com/edubart/otclient>
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "thingstype.h"
|
||||||
|
#include "spritemanager.h"
|
||||||
|
#include "thing.h"
|
||||||
|
#include <framework/core/resourcemanager.h>
|
||||||
|
|
||||||
|
ThingsType g_thingsType;
|
||||||
|
|
||||||
|
bool ThingsType::load(const std::string& file)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
std::stringstream fin;
|
||||||
|
g_resources.loadFile(file, fin);
|
||||||
|
|
||||||
|
m_signature = Fw::getU32(fin);
|
||||||
|
int numItems = Fw::getU16(fin);
|
||||||
|
int numCreatures = Fw::getU16(fin);
|
||||||
|
int numEffects = Fw::getU16(fin);
|
||||||
|
int numShots = Fw::getU16(fin);
|
||||||
|
|
||||||
|
m_itemsType.resize(numItems);
|
||||||
|
for(int id = 100; id < numItems; ++id)
|
||||||
|
parseThingType(fin, m_itemsType[id - 100]);
|
||||||
|
|
||||||
|
m_creaturesType.resize(numItems);
|
||||||
|
for(int id = 0; id < numCreatures; ++id)
|
||||||
|
parseThingType(fin, m_creaturesType[id]);
|
||||||
|
|
||||||
|
m_effectsType.resize(numItems);
|
||||||
|
for(int id = 0; id < numEffects; ++id)
|
||||||
|
parseThingType(fin, m_effectsType[id]);
|
||||||
|
|
||||||
|
m_shotsType.resize(numItems);
|
||||||
|
for(int id = 0; id < numShots; ++id)
|
||||||
|
parseThingType(fin, m_shotsType[id]);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} catch(std::exception& e) {
|
||||||
|
logError("failed to load dat from '", file, "': ", e.what());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThingsType::unload()
|
||||||
|
{
|
||||||
|
m_itemsType.clear();
|
||||||
|
m_creaturesType.clear();
|
||||||
|
m_effectsType.clear();
|
||||||
|
m_shotsType.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ThingsType::parseThingType(std::stringstream& fin, ThingType& thingType)
|
||||||
|
{
|
||||||
|
assert(fin.good());
|
||||||
|
|
||||||
|
bool done = false;
|
||||||
|
while(!done) {
|
||||||
|
uint8 opt = Fw::getU8(fin);
|
||||||
|
|
||||||
|
switch(opt) {
|
||||||
|
case Otc::DatGround: // Grounds, must be drawn first
|
||||||
|
thingType.groundSpeed = Fw::getU16(fin);
|
||||||
|
thingType.isGround = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatGroundClip: // Objects that clips (has transparent pixels) and must be drawn just after ground (e.g: ground borders)
|
||||||
|
thingType.isGroundClip = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatOnBottom: // Bottom items, must be drawn above general items and below creatures (e.g: stairs)
|
||||||
|
thingType.isOnBottom = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatOnTop: // Top items, must be drawn above creatures (e.g: doors)
|
||||||
|
thingType.isOnTop = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatContainer: // Containers
|
||||||
|
thingType.isContainer = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatStackable: // Stackable
|
||||||
|
thingType.isStackable = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatForceUse: // Items that are automatically used when step over?
|
||||||
|
thingType.isForceUse = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatMultiUse: // Usable items
|
||||||
|
thingType.isMultiUse = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatWritable: // Writable
|
||||||
|
thingType.isWritable = true;
|
||||||
|
thingType.maxTextLength = Fw::getU16(fin);
|
||||||
|
break;
|
||||||
|
case Otc::DatWritableOnce: // Writable once. objects that can't be edited by players
|
||||||
|
thingType.isWritableOnce = true;
|
||||||
|
thingType.maxTextLength = Fw::getU16(fin);
|
||||||
|
break;
|
||||||
|
case Otc::DatFluidContainer: // Fluid containers
|
||||||
|
thingType.isFluidContainer = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatSplash: // Splashes
|
||||||
|
thingType.isStackable = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatBlockWalk: // Blocks solid objects (creatures, walls etc)
|
||||||
|
thingType.isNotWalkable = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatNotMovable: // Not movable
|
||||||
|
thingType.isNotMoveable = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatBlockProjectile: // Blocks missiles (walls, magic wall etc)
|
||||||
|
thingType.isNotProjectable = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatBlockPathFind: // Blocks pathfind algorithms (monsters)
|
||||||
|
thingType.isNotPathable = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatPickupable: // Pickupable
|
||||||
|
thingType.isPickupable = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatHangable: // Hangable objects (wallpaper etc)
|
||||||
|
thingType.isHangable = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatHookSouth: // Horizontal walls
|
||||||
|
thingType.isHookSouth = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatHookEast: // Vertical walls
|
||||||
|
thingType.isHookEast = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatRotable: // Rotable
|
||||||
|
thingType.isRotable = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatLight: // Light info
|
||||||
|
thingType.hasLight = true;
|
||||||
|
thingType.lightLevel = Fw::getU16(fin);
|
||||||
|
thingType.lightColor = Fw::getU16(fin);
|
||||||
|
break;
|
||||||
|
case Otc::DatDontHide: // A few monuments that are not supposed to be hidden by floors
|
||||||
|
break;
|
||||||
|
case Otc::DatTranslucent: // Grounds that are translucent
|
||||||
|
thingType.isTranslucent = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatDisplacment: // Must shift draw
|
||||||
|
thingType.xDisplacment = Fw::getU16(fin);
|
||||||
|
thingType.yDisplacment = Fw::getU16(fin);
|
||||||
|
break;
|
||||||
|
case Otc::DatElevation: // Must elevate draw
|
||||||
|
thingType.elevation = Fw::getU16(fin);
|
||||||
|
break;
|
||||||
|
case Otc::DatLyingCorpse: // Some corpses
|
||||||
|
thingType.isLyingCorpse = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatAnimateAlways: // Unknown, check if firesword is a kind of AnimateAlways.
|
||||||
|
thingType.isAnimatedAlways = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatMinimapColor: // Minimap color
|
||||||
|
thingType.hasMiniMapColor = true;
|
||||||
|
thingType.miniMapColor = Fw::getU16(fin);
|
||||||
|
break;
|
||||||
|
case Otc::DatLensHelp: // Used for giving players tips?
|
||||||
|
thingType.isLensHelp = true;
|
||||||
|
thingType.lensHelpParam = Fw::getU16(fin);
|
||||||
|
break;
|
||||||
|
case Otc::DatFullGround: // Grounds that has no transparent pixels
|
||||||
|
thingType.isFullGround = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatIgnoreLook: // Ignore look, then looks at the item on the bottom of it
|
||||||
|
thingType.isIgnoreLook = true;
|
||||||
|
break;
|
||||||
|
case Otc::DatClothe: // Clothes
|
||||||
|
break;
|
||||||
|
case Otc::DatAnimation: // Not used in 8.62
|
||||||
|
break;
|
||||||
|
case Otc::LastDatFlag:
|
||||||
|
done = true;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw std::runtime_error(Fw::mkstr("unknown .dat byte code: ", (int)opt));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
thingType.width = Fw::getU8(fin);
|
||||||
|
thingType.height = Fw::getU8(fin);
|
||||||
|
|
||||||
|
if(thingType.width > 1 || thingType.height > 1)
|
||||||
|
thingType.exactSize = Fw::getU8(fin);
|
||||||
|
else
|
||||||
|
thingType.exactSize = 32;
|
||||||
|
|
||||||
|
thingType.layers = Fw::getU8(fin);
|
||||||
|
thingType.xPattern = Fw::getU8(fin);
|
||||||
|
thingType.yPattern = Fw::getU8(fin);
|
||||||
|
thingType.zPattern = Fw::getU8(fin);
|
||||||
|
thingType.animationPhases = Fw::getU8(fin);
|
||||||
|
|
||||||
|
int totalSprites = thingType.width
|
||||||
|
* thingType.height
|
||||||
|
* thingType.layers
|
||||||
|
* thingType.xPattern
|
||||||
|
* thingType.yPattern
|
||||||
|
* thingType.zPattern
|
||||||
|
* thingType.animationPhases;
|
||||||
|
|
||||||
|
thingType.sprites.resize(totalSprites);
|
||||||
|
for(uint16 i = 0; i < totalSprites; i++)
|
||||||
|
thingType.sprites[i] = Fw::getU16(fin);
|
||||||
|
}
|
|
@ -24,33 +24,32 @@
|
||||||
#define DATMANAGER_H
|
#define DATMANAGER_H
|
||||||
|
|
||||||
#include <framework/global.h>
|
#include <framework/global.h>
|
||||||
#include "thingattributes.h"
|
#include "thingtype.h"
|
||||||
|
|
||||||
class DatManager
|
class ThingsType
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
bool load(const std::string& file);
|
bool load(const std::string& file);
|
||||||
void unload();
|
void unload();
|
||||||
|
|
||||||
void parseThingAttributes(std::stringstream& fin, ThingAttributes& thingAttributes);
|
void parseThingType(std::stringstream& fin, ThingType& thingType);
|
||||||
void parseThingAttributesOpt(std::stringstream& fin, ThingAttributes& thingAttributes, uint8 opt);
|
|
||||||
|
|
||||||
ThingAttributes& getItemAttributes(uint16 id) { return m_itemsAttributes[id - 100]; }
|
ThingType& getItemType(uint16 id) { return m_itemsType[id - 100]; }
|
||||||
ThingAttributes& getCreatureAttributes(uint16 id) { return m_creaturesAttributes[id]; }
|
ThingType& getCreatureType(uint16 id) { return m_creaturesType[id]; }
|
||||||
ThingAttributes& getEffectAttributes(uint16 id) { return m_effectsAttributes[id]; }
|
ThingType& getEffectType(uint16 id) { return m_effectsType[id]; }
|
||||||
ThingAttributes& getShotAttributes(uint16 id) { return m_shotsAttributes[id]; }
|
ThingType& getShotType(uint16 id) { return m_shotsType[id]; }
|
||||||
|
|
||||||
uint32 getSignature() { return m_signature; }
|
uint32 getSignature() { return m_signature; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint32 m_signature;
|
uint32 m_signature;
|
||||||
|
|
||||||
ThingAttributesList m_itemsAttributes;
|
ThingTypeList m_itemsType;
|
||||||
ThingAttributesList m_creaturesAttributes;
|
ThingTypeList m_creaturesType;
|
||||||
ThingAttributesList m_effectsAttributes;
|
ThingTypeList m_effectsType;
|
||||||
ThingAttributesList m_shotsAttributes;
|
ThingTypeList m_shotsType;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern DatManager g_dat;
|
extern ThingsType g_thingsType;
|
||||||
|
|
||||||
#endif
|
#endif
|
|
@ -0,0 +1,130 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2010-2011 OTClient <https://github.com/edubart/otclient>
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
* of this software and associated documentation files (the "Software"), to deal
|
||||||
|
* in the Software without restriction, including without limitation the rights
|
||||||
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
* copies of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be included in
|
||||||
|
* all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
* THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef THINGATTRIBUTES_H
|
||||||
|
#define THINGATTRIBUTES_H
|
||||||
|
|
||||||
|
#include "declarations.h"
|
||||||
|
|
||||||
|
struct ThingType
|
||||||
|
{
|
||||||
|
ThingType() {
|
||||||
|
layers = 0;
|
||||||
|
width = height = 0;
|
||||||
|
exactSize = 0;
|
||||||
|
xPattern = yPattern = zPattern = 0;
|
||||||
|
animationPhases = 0;
|
||||||
|
xDisplacment = yDisplacment = 0;
|
||||||
|
elevation = 0;
|
||||||
|
|
||||||
|
isGround = false;
|
||||||
|
isGroundClip = false;
|
||||||
|
isOnBottom = false;
|
||||||
|
isOnTop = false;
|
||||||
|
isContainer = false;
|
||||||
|
isStackable = false;
|
||||||
|
isForceUse = false;
|
||||||
|
isMultiUse = false;
|
||||||
|
isWritable = false;
|
||||||
|
isWritableOnce = false;
|
||||||
|
isFluidContainer = false;
|
||||||
|
isSplash = false;
|
||||||
|
isNotWalkable = false;
|
||||||
|
isNotMoveable = false;
|
||||||
|
isNotProjectable = false;
|
||||||
|
isNotPathable = false;
|
||||||
|
isPickupable = false;
|
||||||
|
isHangable = false;
|
||||||
|
isHookSouth = false;
|
||||||
|
isHookEast = false;
|
||||||
|
isRotable = false;
|
||||||
|
isDontHide = false;
|
||||||
|
isTranslucent = false;
|
||||||
|
isLyingCorpse = false;
|
||||||
|
isAnimatedAlways = false;
|
||||||
|
isLensHelp = false;
|
||||||
|
isFullGround = false;
|
||||||
|
isIgnoreLook = false;
|
||||||
|
isClothe = false;
|
||||||
|
hasLight = false;
|
||||||
|
hasMiniMapColor = false;
|
||||||
|
|
||||||
|
groundSpeed = 0;
|
||||||
|
fluidParam = 0;
|
||||||
|
maxTextLength = 0;
|
||||||
|
lightLevel = lightColor = 0;
|
||||||
|
miniMapColor = 0;
|
||||||
|
lensHelpParam = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8 layers;
|
||||||
|
uint8 width, height;
|
||||||
|
uint8 exactSize;
|
||||||
|
uint8 xPattern, yPattern, zPattern;
|
||||||
|
uint8 animationPhases;
|
||||||
|
uint16 xDisplacment, yDisplacment;
|
||||||
|
uint16 elevation;
|
||||||
|
std::vector<int> sprites;
|
||||||
|
|
||||||
|
bool isGround;
|
||||||
|
bool isGroundClip;
|
||||||
|
bool isOnBottom;
|
||||||
|
bool isOnTop;
|
||||||
|
bool isContainer;
|
||||||
|
bool isStackable;
|
||||||
|
bool isForceUse;
|
||||||
|
bool isMultiUse;
|
||||||
|
bool isWritable;
|
||||||
|
bool isWritableOnce;
|
||||||
|
bool isFluidContainer;
|
||||||
|
bool isSplash;
|
||||||
|
bool isNotWalkable;
|
||||||
|
bool isNotMoveable;
|
||||||
|
bool isNotProjectable;
|
||||||
|
bool isNotPathable;
|
||||||
|
bool isPickupable;
|
||||||
|
bool isHangable;
|
||||||
|
bool isHookSouth;
|
||||||
|
bool isHookEast;
|
||||||
|
bool isRotable;
|
||||||
|
bool isDontHide;
|
||||||
|
bool isTranslucent;
|
||||||
|
bool isLyingCorpse;
|
||||||
|
bool isAnimatedAlways;
|
||||||
|
bool isLensHelp;
|
||||||
|
bool isFullGround;
|
||||||
|
bool isIgnoreLook;
|
||||||
|
bool isClothe;
|
||||||
|
bool hasLight;
|
||||||
|
bool hasMiniMapColor;
|
||||||
|
|
||||||
|
uint16 groundSpeed;
|
||||||
|
uint8 fluidParam;
|
||||||
|
uint16 maxTextLength;
|
||||||
|
uint16 lightLevel, lightColor;
|
||||||
|
uint16 miniMapColor;
|
||||||
|
uint16 lensHelpParam;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef std::vector<ThingType> ThingTypeList;
|
||||||
|
|
||||||
|
#endif
|
|
@ -22,7 +22,7 @@
|
||||||
|
|
||||||
#include "tile.h"
|
#include "tile.h"
|
||||||
#include "item.h"
|
#include "item.h"
|
||||||
#include "datmanager.h"
|
#include "thingstype.h"
|
||||||
#include "map.h"
|
#include "map.h"
|
||||||
#include "game.h"
|
#include "game.h"
|
||||||
#include "localplayer.h"
|
#include "localplayer.h"
|
||||||
|
@ -43,29 +43,29 @@ void Tile::draw(int x, int y)
|
||||||
|
|
||||||
for(auto it = m_itemsTop.rbegin(), end = m_itemsTop.rend(); it != end; ++it) {
|
for(auto it = m_itemsTop.rbegin(), end = m_itemsTop.rend(); it != end; ++it) {
|
||||||
const ThingPtr& thing = *it;
|
const ThingPtr& thing = *it;
|
||||||
const ThingAttributes& thingAttributes = thing->getAttributes();
|
const ThingType& thingType = thing->getType();
|
||||||
|
|
||||||
if(thingAttributes.isGroundClip) {
|
if(thingType.isGroundClip) {
|
||||||
thing->draw(x - m_drawNextOffset, y - m_drawNextOffset);
|
thing->draw(x - m_drawNextOffset, y - m_drawNextOffset);
|
||||||
m_drawNextOffset += thingAttributes.elevation;
|
m_drawNextOffset += thingType.elevation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(auto it = m_itemsTop.rbegin(), end = m_itemsTop.rend(); it != end; ++it) {
|
for(auto it = m_itemsTop.rbegin(), end = m_itemsTop.rend(); it != end; ++it) {
|
||||||
const ThingPtr& thing = *it;
|
const ThingPtr& thing = *it;
|
||||||
const ThingAttributes& thingAttributes = thing->getAttributes();
|
const ThingType& thingType = thing->getType();
|
||||||
|
|
||||||
if(thingAttributes.isOnBottom) {
|
if(thingType.isOnBottom) {
|
||||||
thing->draw(x - m_drawNextOffset, y - m_drawNextOffset);
|
thing->draw(x - m_drawNextOffset, y - m_drawNextOffset);
|
||||||
m_drawNextOffset += thingAttributes.elevation;
|
m_drawNextOffset += thingType.elevation;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for(auto it = m_itemsBottom.rbegin(), end = m_itemsBottom.rend(); it != end; ++it) {
|
for(auto it = m_itemsBottom.rbegin(), end = m_itemsBottom.rend(); it != end; ++it) {
|
||||||
const ThingPtr& thing = *it;
|
const ThingPtr& thing = *it;
|
||||||
const ThingAttributes& thingAttributes = thing->getAttributes();
|
const ThingType& thingType = thing->getType();
|
||||||
thing->draw(x - m_drawNextOffset, y - m_drawNextOffset);
|
thing->draw(x - m_drawNextOffset, y - m_drawNextOffset);
|
||||||
m_drawNextOffset += thingAttributes.elevation;
|
m_drawNextOffset += thingType.elevation;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(auto it = m_creatures.rbegin(), end = m_creatures.rend(); it != end; ++it) {
|
for(auto it = m_creatures.rbegin(), end = m_creatures.rend(); it != end; ++it) {
|
||||||
|
@ -80,9 +80,9 @@ void Tile::draw(int x, int y)
|
||||||
|
|
||||||
for(auto it = m_itemsTop.rbegin(), end = m_itemsTop.rend(); it != end; ++it) {
|
for(auto it = m_itemsTop.rbegin(), end = m_itemsTop.rend(); it != end; ++it) {
|
||||||
const ThingPtr& thing = *it;
|
const ThingPtr& thing = *it;
|
||||||
const ThingAttributes& thingAttributes = thing->getAttributes();
|
const ThingType& thingType = thing->getType();
|
||||||
|
|
||||||
if(thingAttributes.isOnTop) {
|
if(thingType.isOnTop) {
|
||||||
thing->draw(x, y);
|
thing->draw(x, y);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -94,13 +94,13 @@ void Tile::addThing(ThingPtr thing, int stackpos)
|
||||||
if(!thing)
|
if(!thing)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const ThingAttributes& thingAttributes = thing->getAttributes();
|
const ThingType& thingType = thing->getType();
|
||||||
|
|
||||||
if(thing->asItem()) {
|
if(thing->asItem()) {
|
||||||
if(thingAttributes.isGround)
|
if(thingType.isGround)
|
||||||
m_ground = thing;
|
m_ground = thing;
|
||||||
else {
|
else {
|
||||||
if(thingAttributes.isGroundClip || thingAttributes.isOnBottom || thingAttributes.isOnTop)
|
if(thingType.isGroundClip || thingType.isOnBottom || thingType.isOnTop)
|
||||||
m_itemsTop.push_back(thing);
|
m_itemsTop.push_back(thing);
|
||||||
else {
|
else {
|
||||||
if(stackpos == -1)
|
if(stackpos == -1)
|
||||||
|
@ -171,9 +171,9 @@ void Tile::removeThingByPtr(ThingPtr thing)
|
||||||
{
|
{
|
||||||
// Items
|
// Items
|
||||||
if(thing->asItem()) {
|
if(thing->asItem()) {
|
||||||
const ThingAttributes& thingAttributes = thing->getAttributes();
|
const ThingType& thingType = thing->getType();
|
||||||
|
|
||||||
if(!(thingAttributes.isGroundClip || thingAttributes.isOnBottom || thingAttributes.isOnTop)) {
|
if(!(thingType.isGroundClip || thingType.isOnBottom || thingType.isOnTop)) {
|
||||||
for(auto it = m_itemsBottom.begin(), end = m_itemsBottom.end(); it != end; ++it) {
|
for(auto it = m_itemsBottom.begin(), end = m_itemsBottom.end(); it != end; ++it) {
|
||||||
if(*it == thing) {
|
if(*it == thing) {
|
||||||
m_itemsBottom.erase(it);
|
m_itemsBottom.erase(it);
|
||||||
|
@ -240,7 +240,7 @@ int Tile::getStackSize(int stop)
|
||||||
|
|
||||||
bool Tile::isOpaque()
|
bool Tile::isOpaque()
|
||||||
{
|
{
|
||||||
if(m_ground && !m_ground->getAttributes().isTranslucent)
|
if(m_ground && !m_ground->getType().isTranslucent)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include "protocolgame.h"
|
#include "protocolgame.h"
|
||||||
|
|
||||||
#include <otclient/core/localplayer.h>
|
#include <otclient/core/localplayer.h>
|
||||||
#include <otclient/core/datmanager.h>
|
#include <otclient/core/thingstype.h>
|
||||||
#include <otclient/core/game.h>
|
#include <otclient/core/game.h>
|
||||||
#include <otclient/core/map.h>
|
#include <otclient/core/map.h>
|
||||||
#include <otclient/core/item.h>
|
#include <otclient/core/item.h>
|
||||||
|
@ -1037,8 +1037,8 @@ ItemPtr ProtocolGame::internalGetItem(InputMessage& msg, uint16 id)
|
||||||
id = msg.getU16();
|
id = msg.getU16();
|
||||||
item->setId(id);
|
item->setId(id);
|
||||||
|
|
||||||
const ThingAttributes& itemAttributes = g_dat.getItemAttributes(id);
|
const ThingType& itemType = g_thingsType.getItemType(id);
|
||||||
if(itemAttributes.isStackable || itemAttributes.isFluidContainer || itemAttributes.isSplash == Otc::ThingSplashGroup)
|
if(itemType.isStackable || itemType.isFluidContainer || itemType.isSplash)
|
||||||
item->setCount(msg.getU8());
|
item->setCount(msg.getU8());
|
||||||
|
|
||||||
return item;
|
return item;
|
||||||
|
|
|
@ -37,8 +37,6 @@
|
||||||
#include <otclient/net/protocolgame.h>
|
#include <otclient/net/protocolgame.h>
|
||||||
#include <otclient/core/game.h>
|
#include <otclient/core/game.h>
|
||||||
#include <otclient/core/map.h>
|
#include <otclient/core/map.h>
|
||||||
#include "core/datmanager.h"
|
|
||||||
#include "core/item.h"
|
|
||||||
|
|
||||||
OTClient g_client;
|
OTClient g_client;
|
||||||
|
|
||||||
|
@ -231,28 +229,6 @@ void OTClient::render()
|
||||||
{
|
{
|
||||||
// everything is rendered by UI components
|
// everything is rendered by UI components
|
||||||
g_ui.render();
|
g_ui.render();
|
||||||
|
|
||||||
// utility for viewing dat items
|
|
||||||
/*
|
|
||||||
int count = 0;
|
|
||||||
auto maxSize = g_graphics.getScreenSize();
|
|
||||||
ItemPtr item(new Item);
|
|
||||||
int x = 32;
|
|
||||||
int y = 32;
|
|
||||||
for(int i=100;i<11803;++i) {
|
|
||||||
if(g_dat.getItemAttributes(i).group == Otc::ThingGroundGroup && !g_dat.getItemAttributes(i).changesFloor) {
|
|
||||||
item->setId(i);
|
|
||||||
item->draw(x, y);
|
|
||||||
x += 64;
|
|
||||||
if(x > g_graphics.getScreenSize().width()) {
|
|
||||||
x = 32;
|
|
||||||
y += 64;
|
|
||||||
if(y > maxSize.height())
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void OTClient::loadConfigurations()
|
void OTClient::loadConfigurations()
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#include <otclient/core/player.h>
|
#include <otclient/core/player.h>
|
||||||
#include <otclient/core/localplayer.h>
|
#include <otclient/core/localplayer.h>
|
||||||
#include <otclient/core/map.h>
|
#include <otclient/core/map.h>
|
||||||
#include <otclient/core/datmanager.h>
|
#include <otclient/core/thingstype.h>
|
||||||
#include <otclient/core/spritemanager.h>
|
#include <otclient/core/spritemanager.h>
|
||||||
#include <otclient/net/protocollogin.h>
|
#include <otclient/net/protocollogin.h>
|
||||||
#include <otclient/net/protocolgame.h>
|
#include <otclient/net/protocolgame.h>
|
||||||
|
@ -40,7 +40,7 @@ void OTClient::registerLuaFunctions()
|
||||||
{
|
{
|
||||||
g_lua.bindGlobalFunction("exit", std::bind(&OTClient::exit, &g_client));
|
g_lua.bindGlobalFunction("exit", std::bind(&OTClient::exit, &g_client));
|
||||||
g_lua.bindGlobalFunction("setOnClose", std::bind(&OTClient::setOnClose, &g_client, _1));
|
g_lua.bindGlobalFunction("setOnClose", std::bind(&OTClient::setOnClose, &g_client, _1));
|
||||||
g_lua.bindGlobalFunction("importDat", std::bind(&DatManager::load, &g_dat, _1));
|
g_lua.bindGlobalFunction("importDat", std::bind(&ThingsType::load, &g_thingsType, _1));
|
||||||
g_lua.bindGlobalFunction("importSpr", std::bind(&SpriteManager::load, &g_sprites, _1));
|
g_lua.bindGlobalFunction("importSpr", std::bind(&SpriteManager::load, &g_sprites, _1));
|
||||||
|
|
||||||
g_lua.registerClass<ProtocolLogin, Protocol>();
|
g_lua.registerClass<ProtocolLogin, Protocol>();
|
||||||
|
|
Loading…
Reference in New Issue