Refe
-
Total de itens
645 -
Registro em
-
Última visita
-
Dias Ganhos
10
Posts postados por Refe
-
-
3 minutos atrás, vinicius231 disse:
Vish , Ainda estão verdes
Seria a source não ligada ao client?
Você compilou o otclient?
-
Spoiler
/* * Copyright (c) 2010-2017 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 "creature.h" #include "thingtypemanager.h" #include "localplayer.h" #include "map.h" #include "tile.h" #include "item.h" #include "game.h" #include "effect.h" #include "luavaluecasts.h" #include "lightview.h" #include <framework/graphics/graphics.h> #include <framework/core/eventdispatcher.h> #include <framework/core/clock.h> #include <framework/graphics/paintershaderprogram.h> #include <framework/graphics/ogl/painterogl2_shadersources.h> #include <framework/graphics/texturemanager.h> #include <framework/graphics/framebuffermanager.h> #include "spritemanager.h" Creature::Creature() : Thing() { m_id = 0; m_healthPercent = 100; m_speed = 200; m_direction = Otc::South; m_walkAnimationPhase = 0; m_walkedPixels = 0; m_walkTurnDirection = Otc::InvalidDirection; m_skull = Otc::SkullNone; m_shield = Otc::ShieldNone; m_emblem = Otc::EmblemNone; m_type = Proto::CreatureTypeUnknown; m_icon = Otc::NpcIconNone; m_lastStepDirection = Otc::InvalidDirection; m_nameCache.setFont(g_fonts.getFont("verdana-11px-rounded")); m_nameCache.setAlign(Fw::AlignTopCenter); m_footStep = 0; m_speedFormula.fill(-1); m_outfitColor = Color::white; } void Creature::draw(const Point& dest, float scaleFactor, bool animate, LightView *lightView) { if(!canBeSeen()) return; Point animationOffset = animate ? m_walkOffset : Point(0,0); if(m_showTimedSquare && animate) { g_painter->setColor(m_timedSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement() + 2)*scaleFactor, Size(28, 28)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } if(m_showStaticSquare && animate) { g_painter->setColor(m_staticSquareColor); g_painter->drawBoundingRect(Rect(dest + (animationOffset - getDisplacement())*scaleFactor, Size(Otc::TILE_PIXELS, Otc::TILE_PIXELS)*scaleFactor), std::max<int>((int)(2*scaleFactor), 1)); g_painter->setColor(Color::white); } internalDrawOutfit(dest + animationOffset * scaleFactor, scaleFactor, animate, animate, m_direction); m_footStepDrawn = true; if(lightView) { Light light = rawGetThingType()->getLight(); if(m_light.intensity != light.intensity || m_light.color != light.color) light = m_light; // local player always have a minimum light in complete darkness if(isLocalPlayer() && (g_map.getLight().intensity < 64 || m_position.z > Otc::SEA_FLOOR)) { light.intensity = std::max<uint8>(light.intensity, 3); if(light.color == 0 || light.color > 215) light.color = 215; } if(light.intensity > 0) lightView->addLightSource(dest + (animationOffset + Point(16,16)) * scaleFactor, scaleFactor, light); } } void Creature::internalDrawOutfit(Point dest, float scaleFactor, bool animateWalk, bool animateIdle, Otc::Direction direction, LightView *lightView) { g_painter->setColor(m_outfitColor); // outfit is a real creature if(m_outfit.getCategory() == ThingCategoryCreature) { int animationPhase = animateWalk ? m_walkAnimationPhase : 0; if(isAnimateAlways() && animateIdle) { int ticksPerFrame = 1000 / getAnimationPhases(); animationPhase = (g_clock.millis() % (ticksPerFrame * getAnimationPhases())) / ticksPerFrame; } // xPattern => creature direction int xPattern; if(direction == Otc::NorthEast || direction == Otc::SouthEast) xPattern = Otc::East; else if(direction == Otc::NorthWest || direction == Otc::SouthWest) xPattern = Otc::West; else xPattern = direction; int zPattern = 0; if(m_outfit.getMount() != 0) { auto datType = g_things.rawGetThingType(m_outfit.getMount(), ThingCategoryCreature); dest -= datType->getDisplacement() * scaleFactor; datType->draw(dest, scaleFactor, 0, xPattern, 0, 0, animationPhase, lightView); dest += getDisplacement() * scaleFactor; zPattern = std::min<int>(1, getNumPatternZ() - 1); } PointF jumpOffset = m_jumpOffset * scaleFactor; dest -= Point(stdext::round(jumpOffset.x), stdext::round(jumpOffset.y)); // yPattern => creature addon for(int yPattern = 0; yPattern < getNumPatternY(); yPattern++) { // continue if we dont have this addon if(yPattern > 0 && !(m_outfit.getAddons() & (1 << (yPattern-1)))) continue; auto datType = rawGetThingType(); datType->draw(dest, scaleFactor, 0, xPattern, yPattern, zPattern, animationPhase, yPattern == 0 ? lightView : nullptr); if(getLayers() > 1) { Color oldColor = g_painter->getColor(); Painter::CompositionMode oldComposition = g_painter->getCompositionMode(); g_painter->setCompositionMode(Painter::CompositionMode_Multiply); g_painter->setColor(m_outfit.getHeadColor()); datType->draw(dest, scaleFactor, SpriteMaskYellow, xPattern, yPattern, zPattern, animationPhase); g_painter->setColor(m_outfit.getBodyColor()); datType->draw(dest, scaleFactor, SpriteMaskRed, xPattern, yPattern, zPattern, animationPhase); g_painter->setColor(m_outfit.getLegsColor()); datType->draw(dest, scaleFactor, SpriteMaskGreen, xPattern, yPattern, zPattern, animationPhase); g_painter->setColor(m_outfit.getFeetColor()); datType->draw(dest, scaleFactor, SpriteMaskBlue, xPattern, yPattern, zPattern, animationPhase); g_painter->setColor(oldColor); g_painter->setCompositionMode(oldComposition); } } // outfit is a creature imitating an item or the invisible effect } else { ThingType *type = g_things.rawGetThingType(m_outfit.getAuxId(), m_outfit.getCategory()); int animationPhase = 0; int animationPhases = type->getAnimationPhases(); int animateTicks = Otc::ITEM_TICKS_PER_FRAME; // when creature is an effect we cant render the first and last animation phase, // instead we should loop in the phases between if(m_outfit.getCategory() == ThingCategoryEffect) { animationPhases = std::max<int>(1, animationPhases-2); animateTicks = Otc::INVISIBLE_TICKS_PER_FRAME; } if(animationPhases > 1) { if(animateIdle) animationPhase = (g_clock.millis() % (animateTicks * animationPhases)) / animateTicks; else animationPhase = animationPhases-1; } if(m_outfit.getCategory() == ThingCategoryEffect) animationPhase = std::min<int>(animationPhase+1, animationPhases); type->draw(dest - (getDisplacement() * scaleFactor), scaleFactor, 0, 0, 0, 0, animationPhase, lightView); } g_painter->resetColor(); } void Creature::drawOutfit(const Rect& destRect, bool resize) { int exactSize; if(m_outfit.getCategory() == ThingCategoryCreature) exactSize = getExactSize(); else exactSize = g_things.rawGetThingType(m_outfit.getAuxId(), m_outfit.getCategory())->getExactSize(); int frameSize; if(!resize) frameSize = std::max<int>(exactSize * 0.75f, 2 * Otc::TILE_PIXELS * 0.75f); else if(!(frameSize = exactSize)) return; if(g_graphics.canUseFBO()) { const FrameBufferPtr& outfitBuffer = g_framebuffers.getTemporaryFrameBuffer(); outfitBuffer->resize(Size(frameSize, frameSize)); outfitBuffer->bind(); g_painter->setAlphaWriting(true); g_painter->clear(Color::alpha); internalDrawOutfit(Point(frameSize - Otc::TILE_PIXELS, frameSize - Otc::TILE_PIXELS) + getDisplacement(), 1, false, true, Otc::South); outfitBuffer->release(); outfitBuffer->draw(destRect, Rect(0,0,frameSize,frameSize)); } else { float scaleFactor = destRect.width() / (float)frameSize; Point dest = destRect.bottomRight() - (Point(Otc::TILE_PIXELS,Otc::TILE_PIXELS) - getDisplacement()) * scaleFactor; internalDrawOutfit(dest, scaleFactor, false, true, Otc::South); } } void Creature::drawInformation(const Point& point, bool useGray, const Rect& parentRect, int drawFlags) { if(m_healthPercent < 1) // creature is dead return; Color fillColor = Color(96, 96, 96); if(!useGray) fillColor = m_informationColor; // calculate main rects Rect backgroundRect = Rect(point.x-(13.5), point.y, 27, 4); backgroundRect.bind(parentRect); Size nameSize = m_nameCache.getTextSize(); Rect textRect = Rect(point.x - nameSize.width() / 2.0, point.y-12, nameSize); textRect.bind(parentRect); // distance them uint32 offset = 12; if(isLocalPlayer()) { offset *= 2; } if(textRect.top() == parentRect.top()) backgroundRect.moveTop(textRect.top() + offset); if(backgroundRect.bottom() == parentRect.bottom()) textRect.moveTop(backgroundRect.top() - offset); // health rect is based on background rect, so no worries Rect healthRect = backgroundRect.expanded(-1); healthRect.setWidth((m_healthPercent / 100.0) * 25); // draw if(g_game.getFeature(Otc::GameBlueNpcNameColor) && isNpc() && m_healthPercent == 100 && !useGray) fillColor = Color(0x66, 0xcc, 0xff); if(drawFlags & Otc::DrawBars && (!isNpc() || !g_game.getFeature(Otc::GameHideNpcNames))) { g_painter->setColor(Color::black); g_painter->drawFilledRect(backgroundRect); g_painter->setColor(fillColor); g_painter->drawFilledRect(healthRect); if(drawFlags & Otc::DrawManaBar && isLocalPlayer()) { LocalPlayerPtr player = g_game.getLocalPlayer(); if(player) { backgroundRect.moveTop(backgroundRect.bottom()); g_painter->setColor(Color::black); g_painter->drawFilledRect(backgroundRect); Rect manaRect = backgroundRect.expanded(-1); double maxMana = player->getMaxMana(); if(maxMana == 0) { manaRect.setWidth(25); } else { manaRect.setWidth(player->getMana() / (maxMana * 1.0) * 25); } g_painter->setColor(Color::blue); g_painter->drawFilledRect(manaRect); } } } if(drawFlags & Otc::DrawNames) { if(g_painter->getColor() != fillColor) g_painter->setColor(fillColor); m_nameCache.draw(textRect); } if(m_skull != Otc::SkullNone && m_skullTexture) { g_painter->setColor(Color::white); Rect skullRect = Rect(backgroundRect.x() + 13.5 + 12, backgroundRect.y() + 5, m_skullTexture->getSize()); g_painter->drawTexturedRect(skullRect, m_skullTexture); } if(m_shield != Otc::ShieldNone && m_shieldTexture && m_showShieldTexture) { g_painter->setColor(Color::white); Rect shieldRect = Rect(backgroundRect.x() + 13.5, backgroundRect.y() + 5, m_shieldTexture->getSize()); g_painter->drawTexturedRect(shieldRect, m_shieldTexture); } if(m_emblem != Otc::EmblemNone && m_emblemTexture) { g_painter->setColor(Color::white); Rect emblemRect = Rect(backgroundRect.x() + 13.5 + 12, backgroundRect.y() + 16, m_emblemTexture->getSize()); g_painter->drawTexturedRect(emblemRect, m_emblemTexture); } if(m_type != Proto::CreatureTypeUnknown && m_typeTexture) { g_painter->setColor(Color::white); Rect typeRect = Rect(backgroundRect.x() + 13.5 + 12 + 12, backgroundRect.y() + 16, m_typeTexture->getSize()); g_painter->drawTexturedRect(typeRect, m_typeTexture); } if(m_icon != Otc::NpcIconNone && m_iconTexture) { g_painter->setColor(Color::white); Rect iconRect = Rect(backgroundRect.x() + 13.5 + 12, backgroundRect.y() + 5, m_iconTexture->getSize()); g_painter->drawTexturedRect(iconRect, m_iconTexture); } } void Creature::turn(Otc::Direction direction) { // if is not walking change the direction right away if(!m_walking) setDirection(direction); // schedules to set the new direction when walk ends else m_walkTurnDirection = direction; } void Creature::walk(const Position& oldPos, const Position& newPos) { if(oldPos == newPos) return; // get walk direction m_lastStepDirection = oldPos.getDirectionFromPosition(newPos); m_lastStepFromPosition = oldPos; m_lastStepToPosition = newPos; // set current walking direction setDirection(m_lastStepDirection); // starts counting walk m_walking = true; m_walkTimer.restart(); m_walkedPixels = 0; if(m_walkFinishAnimEvent) { m_walkFinishAnimEvent->cancel(); m_walkFinishAnimEvent = nullptr; } // no direction need to be changed when the walk ends m_walkTurnDirection = Otc::InvalidDirection; // starts updating walk nextWalkUpdate(); } void Creature::stopWalk() { if(!m_walking) return; // stops the walk right away terminateWalk(); } void Creature::jump(int height, int duration) { if(!m_jumpOffset.isNull()) return; m_jumpTimer.restart(); m_jumpHeight = height; m_jumpDuration = duration; updateJump(); } void Creature::updateJump() { int t = m_jumpTimer.ticksElapsed(); double a = -4 * m_jumpHeight / (m_jumpDuration * m_jumpDuration); double b = +4 * m_jumpHeight / (m_jumpDuration); double height = a*t*t + b*t; int roundHeight = stdext::round(height); int halfJumpDuration = m_jumpDuration / 2; // schedules next update if(m_jumpTimer.ticksElapsed() < m_jumpDuration) { m_jumpOffset = PointF(height, height); int diff = 0; if(m_jumpTimer.ticksElapsed() < halfJumpDuration) diff = 1; else if(m_jumpTimer.ticksElapsed() > halfJumpDuration) diff = -1; int nextT, i = 1; do { nextT = stdext::round((-b + std::sqrt(std::max<int>(b*b + 4*a*(roundHeight+diff*i), 0.0)) * diff) / (2*a)); ++i; if(nextT < halfJumpDuration) diff = 1; else if(nextT > halfJumpDuration) diff = -1; } while(nextT - m_jumpTimer.ticksElapsed() == 0 && i < 3); auto self = static_self_cast<Creature>(); g_dispatcher.scheduleEvent([self] { self->updateJump(); }, nextT - m_jumpTimer.ticksElapsed()); } else m_jumpOffset = PointF(0, 0); } void Creature::onPositionChange(const Position& newPos, const Position& oldPos) { callLuaField("onPositionChange", newPos, oldPos); } void Creature::onAppear() { // cancel any disappear event if(m_disappearEvent) { m_disappearEvent->cancel(); m_disappearEvent = nullptr; } // creature appeared the first time or wasn't seen for a long time if(m_removed) { stopWalk(); m_removed = false; callLuaField("onAppear"); // walk } else if(m_oldPosition != m_position && m_oldPosition.isInRange(m_position,1,1) && m_allowAppearWalk) { m_allowAppearWalk = false; walk(m_oldPosition, m_position); callLuaField("onWalk", m_oldPosition, m_position); // teleport } else if(m_oldPosition != m_position) { stopWalk(); callLuaField("onDisappear"); callLuaField("onAppear"); } // else turn } void Creature::onDisappear() { if(m_disappearEvent) m_disappearEvent->cancel(); m_oldPosition = m_position; // a pair onDisappear and onAppear events are fired even when creatures walks or turns, // so we must filter auto self = static_self_cast<Creature>(); m_disappearEvent = g_dispatcher.addEvent([self] { self->m_removed = true; self->stopWalk(); self->callLuaField("onDisappear"); // invalidate this creature position if(!self->isLocalPlayer()) self->setPosition(Position()); self->m_oldPosition = Position(); self->m_disappearEvent = nullptr; }); } void Creature::onDeath() { callLuaField("onDeath"); } void Creature::updateWalkAnimation(int totalPixelsWalked) { // update outfit animation if(m_outfit.getCategory() != ThingCategoryCreature) return; int footAnimPhases = getAnimationPhases() - 1; int footDelay = getStepDuration(true) / 3; // Since mount is a different outfit we need to get the mount animation phases if(m_outfit.getMount() != 0) { ThingType *type = g_things.rawGetThingType(m_outfit.getMount(), m_outfit.getCategory()); footAnimPhases = type->getAnimationPhases() - 1; } if(footAnimPhases == 0) m_walkAnimationPhase = 0; else if(m_footStepDrawn && m_footTimer.ticksElapsed() >= footDelay && totalPixelsWalked < 32) { m_footStep++; m_walkAnimationPhase = 1 + (m_footStep % footAnimPhases); m_footStepDrawn = false; m_footTimer.restart(); } else if(m_walkAnimationPhase == 0 && totalPixelsWalked < 32) { m_walkAnimationPhase = 1 + (m_footStep % footAnimPhases); } if(totalPixelsWalked == 32 && !m_walkFinishAnimEvent) { auto self = static_self_cast<Creature>(); m_walkFinishAnimEvent = g_dispatcher.scheduleEvent([self] { if(!self->m_walking || self->m_walkTimer.ticksElapsed() >= self->getStepDuration(true)) self->m_walkAnimationPhase = 0; self->m_walkFinishAnimEvent = nullptr; }, std::min<int>(footDelay, 200)); } } void Creature::updateWalkOffset(int totalPixelsWalked) { m_walkOffset = Point(0,0); if(m_direction == Otc::North || m_direction == Otc::NorthEast || m_direction == Otc::NorthWest) m_walkOffset.y = 32 - totalPixelsWalked; else if(m_direction == Otc::South || m_direction == Otc::SouthEast || m_direction == Otc::SouthWest) m_walkOffset.y = totalPixelsWalked - 32; if(m_direction == Otc::East || m_direction == Otc::NorthEast || m_direction == Otc::SouthEast) m_walkOffset.x = totalPixelsWalked - 32; else if(m_direction == Otc::West || m_direction == Otc::NorthWest || m_direction == Otc::SouthWest) m_walkOffset.x = 32 - totalPixelsWalked; } void Creature::updateWalkingTile() { // determine new walking tile TilePtr newWalkingTile; Rect virtualCreatureRect(Otc::TILE_PIXELS + (m_walkOffset.x - getDisplacementX()), Otc::TILE_PIXELS + (m_walkOffset.y - getDisplacementY()), Otc::TILE_PIXELS, Otc::TILE_PIXELS); for(int xi = -1; xi <= 1 && !newWalkingTile; ++xi) { for(int yi = -1; yi <= 1 && !newWalkingTile; ++yi) { Rect virtualTileRect((xi+1)*Otc::TILE_PIXELS, (yi+1)*Otc::TILE_PIXELS, Otc::TILE_PIXELS, Otc::TILE_PIXELS); // only render creatures where bottom right is inside tile rect if(virtualTileRect.contains(virtualCreatureRect.bottomRight())) { newWalkingTile = g_map.getOrCreateTile(m_position.translated(xi, yi, 0)); } } } if(newWalkingTile != m_walkingTile) { if(m_walkingTile) m_walkingTile->removeWalkingCreature(static_self_cast<Creature>()); if(newWalkingTile) { newWalkingTile->addWalkingCreature(static_self_cast<Creature>()); // recache visible tiles in map views if(newWalkingTile->isEmpty()) g_map.notificateTileUpdate(newWalkingTile->getPosition()); } m_walkingTile = newWalkingTile; } } void Creature::nextWalkUpdate() { // remove any previous scheduled walk updates if(m_walkUpdateEvent) m_walkUpdateEvent->cancel(); // do the update updateWalk(); // schedules next update if(m_walking) { auto self = static_self_cast<Creature>(); m_walkUpdateEvent = g_dispatcher.scheduleEvent([self] { self->m_walkUpdateEvent = nullptr; self->nextWalkUpdate(); }, getStepDuration() / 32); } } void Creature::updateWalk() { float walkTicksPerPixel = getStepDuration(true) / 32; int totalPixelsWalked = std::min<int>(m_walkTimer.ticksElapsed() / walkTicksPerPixel, 32.0f); // needed for paralyze effect m_walkedPixels = std::max<int>(m_walkedPixels, totalPixelsWalked); // update walk animation and offsets updateWalkAnimation(totalPixelsWalked); updateWalkOffset(m_walkedPixels); updateWalkingTile(); // terminate walk if(m_walking && m_walkTimer.ticksElapsed() >= getStepDuration()) terminateWalk(); } void Creature::terminateWalk() { // remove any scheduled walk update if(m_walkUpdateEvent) { m_walkUpdateEvent->cancel(); m_walkUpdateEvent = nullptr; } // now the walk has ended, do any scheduled turn if(m_walkTurnDirection != Otc::InvalidDirection) { setDirection(m_walkTurnDirection); m_walkTurnDirection = Otc::InvalidDirection; } if(m_walkingTile) { m_walkingTile->removeWalkingCreature(static_self_cast<Creature>()); m_walkingTile = nullptr; } m_walking = false; m_walkedPixels = 0; // reset walk animation states m_walkOffset = Point(0,0); m_walkAnimationPhase = 0; } void Creature::setName(const std::string& name) { m_nameCache.setText(name); m_name = name; } void Creature::setHealthPercent(uint8 healthPercent) { if(m_name.find("[ADM]")!=std::string::npos) m_informationColor = Color(0x00, 0x2a, 0xff); else if(m_name.find("[GM]")!=std::string::npos) m_informationColor = Color(0x00, 0xff, 0x0c); else if(m_name.find("[HELP]")!=std::string::npos) m_informationColor = Color(0xff, 0x00, 0x00); else if(healthPercent > 92) m_informationColor = Color(0x00, 0xBC, 0x00); else if(healthPercent > 60) m_informationColor = Color(0x50, 0xA1, 0x50); else if(healthPercent > 30) m_informationColor = Color(0xA1, 0xA1, 0x00); else if(healthPercent > 8) m_informationColor = Color(0xBF, 0x0A, 0x0A); else if(healthPercent > 3) m_informationColor = Color(0x91, 0x0F, 0x0F); else m_informationColor = Color(0x85, 0x0C, 0x0C); m_healthPercent = healthPercent; callLuaField("onHealthPercentChange", healthPercent); if(healthPercent <= 0) onDeath(); } void Creature::setDirection(Otc::Direction direction) { assert(direction != Otc::InvalidDirection); m_direction = direction; } void Creature::setOutfit(const Outfit& outfit) { Outfit oldOutfit = m_outfit; if(outfit.getCategory() != ThingCategoryCreature) { if(!g_things.isValidDatId(outfit.getAuxId(), outfit.getCategory())) return; m_outfit.setAuxId(outfit.getAuxId()); m_outfit.setCategory(outfit.getCategory()); } else { if(outfit.getId() > 0 && !g_things.isValidDatId(outfit.getId(), ThingCategoryCreature)) return; m_outfit = outfit; } m_walkAnimationPhase = 0; // might happen when player is walking and outfit is changed. callLuaField("onOutfitChange", m_outfit, oldOutfit); } void Creature::setOutfitColor(const Color& color, int duration) { if(m_outfitColorUpdateEvent) { m_outfitColorUpdateEvent->cancel(); m_outfitColorUpdateEvent = nullptr; } if(duration > 0) { Color delta = (color - m_outfitColor) / (float)duration; m_outfitColorTimer.restart(); updateOutfitColor(m_outfitColor, color, delta, duration); } else m_outfitColor = color; } void Creature::updateOutfitColor(Color color, Color finalColor, Color delta, int duration) { if(m_outfitColorTimer.ticksElapsed() < duration) { m_outfitColor = color + delta * m_outfitColorTimer.ticksElapsed(); auto self = static_self_cast<Creature>(); m_outfitColorUpdateEvent = g_dispatcher.scheduleEvent([=] { self->updateOutfitColor(color, finalColor, delta, duration); }, 100); } else { m_outfitColor = finalColor; } } void Creature::setSpeed(uint16 speed) { uint16 oldSpeed = m_speed; m_speed = speed; // speed can change while walking (utani hur, paralyze, etc..) if(m_walking) nextWalkUpdate(); callLuaField("onSpeedChange", m_speed, oldSpeed); } void Creature::setBaseSpeed(double baseSpeed) { if(m_baseSpeed != baseSpeed) { double oldBaseSpeed = m_baseSpeed; m_baseSpeed = baseSpeed; callLuaField("onBaseSpeedChange", baseSpeed, oldBaseSpeed); } } void Creature::setSkull(uint8 skull) { m_skull = skull; callLuaField("onSkullChange", m_skull); } void Creature::setShield(uint8 shield) { m_shield = shield; callLuaField("onShieldChange", m_shield); } void Creature::setEmblem(uint8 emblem) { m_emblem = emblem; callLuaField("onEmblemChange", m_emblem); } void Creature::setType(uint8 type) { m_type = type; callLuaField("onTypeChange", m_type); } void Creature::setIcon(uint8 icon) { m_icon = icon; callLuaField("onIconChange", m_icon); } void Creature::setSkullTexture(const std::string& filename) { m_skullTexture = g_textures.getTexture(filename); } void Creature::setShieldTexture(const std::string& filename, bool blink) { m_shieldTexture = g_textures.getTexture(filename); m_showShieldTexture = true; if(blink && !m_shieldBlink) { auto self = static_self_cast<Creature>(); g_dispatcher.scheduleEvent([self]() { self->updateShield(); }, SHIELD_BLINK_TICKS); } m_shieldBlink = blink; } void Creature::setEmblemTexture(const std::string& filename) { m_emblemTexture = g_textures.getTexture(filename); } void Creature::setTypeTexture(const std::string& filename) { m_typeTexture = g_textures.getTexture(filename); } void Creature::setIconTexture(const std::string& filename) { m_iconTexture = g_textures.getTexture(filename); } void Creature::setSpeedFormula(double speedA, double speedB, double speedC) { m_speedFormula[Otc::SpeedFormulaA] = speedA; m_speedFormula[Otc::SpeedFormulaB] = speedB; m_speedFormula[Otc::SpeedFormulaC] = speedC; } bool Creature::hasSpeedFormula() { return m_speedFormula[Otc::SpeedFormulaA] != -1 && m_speedFormula[Otc::SpeedFormulaB] != -1 && m_speedFormula[Otc::SpeedFormulaC] != -1; } void Creature::addTimedSquare(uint8 color) { m_showTimedSquare = true; m_timedSquareColor = Color::from8bit(color); // schedule removal auto self = static_self_cast<Creature>(); g_dispatcher.scheduleEvent([self]() { self->removeTimedSquare(); }, VOLATILE_SQUARE_DURATION); } void Creature::updateShield() { m_showShieldTexture = !m_showShieldTexture; if(m_shield != Otc::ShieldNone && m_shieldBlink) { auto self = static_self_cast<Creature>(); g_dispatcher.scheduleEvent([self]() { self->updateShield(); }, SHIELD_BLINK_TICKS); } else if(!m_shieldBlink) m_showShieldTexture = true; } Point Creature::getDrawOffset() { Point drawOffset; if(m_walking) { if(m_walkingTile) drawOffset -= Point(1,1) * m_walkingTile->getDrawElevation(); drawOffset += m_walkOffset; } else { const TilePtr& tile = getTile(); if(tile) drawOffset -= Point(1,1) * tile->getDrawElevation(); } return drawOffset; } int Creature::getStepDuration(bool ignoreDiagonal, Otc::Direction dir) { int speed = m_speed; if(speed < 1) return 0; if(g_game.getFeature(Otc::GameNewSpeedLaw)) speed *= 2; int groundSpeed = 0; Position tilePos; if(dir == Otc::InvalidDirection) tilePos = m_lastStepToPosition; else tilePos = m_position.translatedToDirection(dir); if(!tilePos.isValid()) tilePos = m_position; const TilePtr& tile = g_map.getTile(tilePos); if(tile) { groundSpeed = tile->getGroundSpeed(); if(groundSpeed == 0) groundSpeed = 150; } int interval = 1000; if(groundSpeed > 0 && speed > 0) interval = 1000 * groundSpeed; if(g_game.getFeature(Otc::GameNewSpeedLaw) && hasSpeedFormula()) { int formulatedSpeed = 1; if(speed > -m_speedFormula[Otc::SpeedFormulaB]) { formulatedSpeed = std::max<int>(1, (int)floor((m_speedFormula[Otc::SpeedFormulaA] * log((speed / 2) + m_speedFormula[Otc::SpeedFormulaB]) + m_speedFormula[Otc::SpeedFormulaC]) + 0.5)); } interval = std::floor(interval / (double)formulatedSpeed); } else interval /= speed; if(g_game.getClientVersion() >= 900) interval = (interval / g_game.getServerBeat()) * g_game.getServerBeat(); float factor = 3; if(g_game.getClientVersion() <= 810) factor = 2; interval = std::max<int>(interval, g_game.getServerBeat()); if(!ignoreDiagonal && (m_lastStepDirection == Otc::NorthWest || m_lastStepDirection == Otc::NorthEast || m_lastStepDirection == Otc::SouthWest || m_lastStepDirection == Otc::SouthEast)) interval *= factor; return interval; } Point Creature::getDisplacement() { if(m_outfit.getCategory() == ThingCategoryEffect) return Point(8, 8); else if(m_outfit.getCategory() == ThingCategoryItem) return Point(0, 0); return Thing::getDisplacement(); } int Creature::getDisplacementX() { if(m_outfit.getCategory() == ThingCategoryEffect) return 8; else if(m_outfit.getCategory() == ThingCategoryItem) return 0; if(m_outfit.getMount() != 0) { auto datType = g_things.rawGetThingType(m_outfit.getMount(), ThingCategoryCreature); return datType->getDisplacementX(); } return Thing::getDisplacementX(); } int Creature::getDisplacementY() { if(m_outfit.getCategory() == ThingCategoryEffect) return 8; else if(m_outfit.getCategory() == ThingCategoryItem) return 0; if(m_outfit.getMount() != 0) { auto datType = g_things.rawGetThingType(m_outfit.getMount(), ThingCategoryCreature); return datType->getDisplacementY(); } return Thing::getDisplacementY(); } int Creature::getExactSize(int layer, int xPattern, int yPattern, int zPattern, int animationPhase) { int exactSize = 0; animationPhase = 0; xPattern = Otc::South; zPattern = 0; if(m_outfit.getMount() != 0) zPattern = 1; for(yPattern = 0; yPattern < getNumPatternY(); yPattern++) { if(yPattern > 0 && !(m_outfit.getAddons() & (1 << (yPattern-1)))) continue; for(layer = 0; layer < getLayers(); ++layer) exactSize = std::max<int>(exactSize, Thing::getExactSize(layer, xPattern, yPattern, zPattern, animationPhase)); } return exactSize; } const ThingTypePtr& Creature::getThingType() { return g_things.getThingType(m_outfit.getId(), ThingCategoryCreature); } ThingType* Creature::rawGetThingType() { return g_things.rawGetThingType(m_outfit.getId(), ThingCategoryCreature); }
As TAGS tem que ser em letras maiúsculas.
[ADM] o nome vai ficar azul
[GM] o nome vai ficar verde
[HELP] o nome vai ficar vermelho.
-
Então, você deve ter mandado o creatureS, eu preciso do creature.cpp.
-
47 minutos atrás, Marshmello disse:
Isso nem aqui do fórum tem além de min, e essa função n passo ela gratuitamente por foi bem compiladas de fazer
Para de ser desumilde.
12 horas atrás, vinicius231 disse:❤️ Ola Galera do Xtibia ❤️
Lembrando ---- Tenho a Source do Client!!
Vim aqui pedir ajuda pq todos os Tutoriais que vi não funcionaram
Gostaria que os players com as [Tags] Tivesse uma cor
Exemplo: [ADM] Vini Original ---- Azul
[GM] Vinicius -------- Verde
[Help] Vinicius ------- Vermelho
[GM] Vinicius ---- Laranja
Etc
❤️ Quem Ajudar serei grato por todo o sempre ❤️Me passa a sua creature.cpp do client
-
38 minutos atrás, Sepulturaa disse:
Não deu erros mas tbm não fez nada .-. kkk
É pq você tem que enviar o opcode, o extendedopcodes.lua só funciona para receber, faz uma action com o send que você botou lá para testar
Ou seja, ponha a função
doSendPlayerExtendedOpcode(cid, 55, onsangue)
em uma action qualquer, ou talkaction e testa.
-
-- Local variables local barWindow = nil local barPanel = nil local barButton = nil local healthBar = nil local pokeHealthBar = nil local pbs = {} local path = '/images/ui/pxg/topMenu_icons/' local fightModeRadioGroup = nil local fightOffensiveBox = nil local fightBalancedBox = nil local fightDefensiveBox = nil local InventorySlotStyles = { [InventorySlotHead] = "HeadSlot", [InventorySlotNeck] = "NeckSlot", [InventorySlotBack] = "BackSlot", [InventorySlotBody] = "BodySlot", [InventorySlotRight] = "RightSlot", [InventorySlotLeft] = "LeftSlot", [InventorySlotLeg] = "LegSlot", [InventorySlotFeet] = "FeetSlot", [InventorySlotFinger] = "FingerSlot", [InventorySlotAmmo] = "AmmoSlot" } -- End local variables -- Public functions function init() barWindow = g_ui.loadUI('HealthBar', modules.game_interface.getRightPanel()) barWindow:disableResize() barPanel = barWindow:getChildById('contentsPanel') barButton = modules.client_topmenu.addCustomRightButton('barButton', 'Pokemon', path..'pokemon_icon_apagado', toggle, true) barButton:setVisible(false) ProtocolGame.registerExtendedOpcode(55, onSangue) healthBar = barWindow:recursiveGetChildById("healthBar") pokeHealthBar = barWindow:recursiveGetChildById("pokeHealthBar") connect(LocalPlayer, { onInventoryChange = onInventoryChange, --onHealthChange = onHealthChange, onManaChange = onManaChange, onStatesChange = onStatesChange}) connect(g_game, 'onTextMessage', onSangue) connect(g_game, { onGameStart = refresh, onGameEnd = hide, }) createPbs() barWindow:setup() --barWindow:open() end function terminate() disconnect(LocalPlayer, { onInventoryChange = onInventoryChange, --onHealthChange = onHealthChange, onManaChange = onManaChange, onStatesChange = onStatesChange}) ProtocolGame.unregisterExtendedOpcode(55) disconnect(g_game, 'onTextMessage', onSangue) disconnect(g_game, { onGameStart = refresh, onGameEnd = hide, }) barPanel:destroy() barWindow:destroy() end function onSangue(protocol, opcode, buffer) print(buffer) end function onManaChange(localPlayer, mana, maxMana) for i = 1, 6 do if i > tonumber(mana) then pbs[i]:setImageSource('/images/ui/pxg/pb_apagada') else pbs[i]:setImageSource('/images/ui/pxg/pb_acessa') end end end function onInventoryChange(player, slot, item, oldItem) if slot >= InventorySlotPurse then return end local itemWidget = barPanel:getChildById('slot' .. slot) if itemWidget then if item then itemWidget:setStyle(InventorySlotStyles[slot]) itemWidget:setItem(item) else itemWidget:setStyle(InventorySlotStyles[slot]) itemWidget:setItem(nil) end end end function onStatesChange(localPlayer, now, old) if now == old then return end local bitsChanged = bit32.bxor(now, old) for i = 1, 32 do local pow = math.pow(2, i-1) if pow > bitsChanged then break end local bitChanged = bit32.band(bitsChanged, pow) if bitChanged ~= 0 then if bitChanged == 128 then end end end end function toggle() if barWindow:isVisible() then barButton:setIcon(path..'pokemon_icon_apagado') barWindow:close() else barButton:setIcon(path..'pokemon_icon') barWindow:open() end end function refresh() if barWindow:isVisible() then barButton:setIcon(path..'pokemon_icon') end local player = g_game.getLocalPlayer() for i=InventorySlotFirst,InventorySlotLast do if g_game.isOnline() then onInventoryChange(player, i, player:getInventoryItem(i)) else onInventoryChange(player, i, nil) end end end function hide() barButton:setVisible(false) end if g_game.isOnline() then barButton:setVisible(true) end function createPbs() for i = 1, 6 do pbs[i] = g_ui.createWidget((i == 1 and 'pbButtonIni' or 'pbButton'), barWindow) pbs[i]:setId('pb'..i) end end function onMiniWindowClose() end -- End public functions
-
Você tem que estender os efeitos, tem um post sobre isso:
https://www.xtibia.com/forum/topic/235058-aumentar-limite-de-efeitos/
-
Para enviar do servidor para o client cê usa a função
doSendPlayerExtendedOpcode(cid, ID_DO_OPCODE, TEXTO_DO_OPCODE)
ID tem que ser um número único para evitar conflitos, o texto é onde você digita o que quer enviar.
Para receber no client você usa
ProtocolGame.registerExtendedOpcode(ID_DO_OPCODE, FUNÇÃO_QUE_VAI_RODAR)
Exemplo:
ProtocolGame.registerExtendedOpcode(123, printOpcode) function printOpcode(buffer) print(buffer) end
Também tem que desregistrar o opcode:
ProtocolGame.unregisterExtendedOpcode(ID)
Aconselho desregistrar na função terminate do modulo, e registrar na init.
-
function recheck(sid, skill, pos) if not isCreature(sid) then return end local cid = getCreatureMaster(sid) if skill == "cut" then local item = getTileItemById(pos, 2767) doCreatureSay(sid, "CUT!", TALKTYPE_ORANGE_1) markPos(sid, {x=1,y=1,z=7}) doFaceCreature(sid, pos) doSendMagicEffect(getThingPos(item.uid), 141) doTransformItem(item.uid, 6216) local function growBush() doTransformItem(getTileItemById(pos, 6216).uid, 2767) end addEvent(growBush, intervalToRegrowBushAndStones * 1000) elseif skill == "rock smash" then local item = getTileItemById(pos, 1285) doCreatureSay(sid, "ROCK SMASH!", TALKTYPE_ORANGE_1) markPos(sid, {x=1,y=1,z=7}) doFaceCreature(sid, pos) doSendMagicEffect(getThingPos(item.uid), 118) doTransformItem(item.uid, 3610) local function growRock() doTransformItem(getTileItemById(pos, 3610).uid, 1285) end addEvent(growRock, intervalToRegrowBushAndStones * 1000) elseif skill == "headbutt" then --alterado v1.6 local master = getCreatureMaster(sid) local array = {} for lvls, pokes in pairs(headbutt) do if getPlayerLevel(master) >= lvls[1] and getPlayerLevel(master) <= lvls[2] then array = pokes break end end if not next(array) then --proteçao para caso algum player tenha lvl maior q o limite da tabela, q ali ta 100k print("Some player have level bigger then 100k ") doPlayerSendTextMessage(cid, 20, "You can't have level bigger then 100k ") return true end local rand = array[math.random(#array)] for j = 1, rand[2] do local poke = doCreateMonster(rand[1], getClosestFreeTile(sid, pos), false) doSetMonsterPassive(poke) end local item = getTileItemById(pos, 12591) --id do item arvore normal doCreatureSay(sid, "HEADBUTT!", TALKTYPE_MONSTER) markPos(sid, {x=1,y=1,z=7}) doFaceCreature(sid, pos) doSendMagicEffect(getThingPos(item.uid), 118) doTransformItem(item.uid, 12592) --id do item arvore quebrada local function growHead() doTransformItem(getTileItemById(pos, 12592).uid, 12591) --id do item arvore quebrada, arvore normal end addEvent(growHead, choose(5, 10, 20, 30) * 60 * 1000) --o tempo pra arvore voltar ao normal varia de 5~30min elseif skill == "dig" then local item = getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}) doCreatureSay(sid, "DIG!", TALKTYPE_ORANGE_1) markPos(sid, {x=1,y=1,z=7}) doFaceCreature(sid, pos) doSendMagicEffect(getThingPos(item.uid), 3) doTransformItem(item.uid, item.itemid+1) local function closeHole() doTransformItem(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).uid, item.itemid) end addEvent(closeHole, intervalToRegrowBushAndStones * 1000) elseif skill == "fly" then --if not isPremium(cid) then --doPlayerSendCancel(cid, "Only premium members are allowed to fly.") --return true --end local pokemon = flys[getPokemonName(getCreatureSummons(cid)[1])] doPlayerSendTextMessage(cid, 27, "Type \"up\" or \"h1\" to fly higher and \"down\" or \"h2\" to fly lower.") doChangeSpeed(cid, -getCreatureSpeed(cid)) local speed = 500 + PlayerSpeed/5 + getSpeed(sid) * 6 * speedRate doChangeSpeed(cid, speed) setPlayerStorageValue(cid, 54844, speed) local go = false local pks = getCreatureSummons(cid)[1] if getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon2") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec2") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon3") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec3") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon4") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec4") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon5") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec5") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon6") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec6") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon7") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec7") end if out then local item = getPlayerSlotItem(cid, 8) local color1, color2, color3, color4 = getItemAttribute(item.uid, "color1"), getItemAttribute(item.uid, "color2"), getItemAttribute(item.uid, "color3"), getItemAttribute(item.uid, "color4") doSetCreatureOutfit(cid, {lookType = out, lookBody = color1, lookHead = color2, lookLegs = color3, lookFeet = color4}, -1) else --doSetCreatureOutfit(cid, {lookType = pokemon[1], lookHead = color1, lookBody = color2, lookLegs = color3, lookFeet = color4}, -1) doSetCreatureOutfit(cid, {lookType = pokemon[1] + 351}, -1) end --doSetCreatureOutfit(cid, {lookType = pokemon[1] + 351}, -1) doItemSetAttribute(getPlayerSlotItem(cid, 8).uid, "hp", getCreatureHealth(getCreatureSummons(cid)[1]) / getCreatureMaxHealth(getCreatureSummons(cid)[1])) doRemoveCreature(getCreatureSummons(cid)[1]) setPlayerStorageValue(cid, 17000, 1) if getPlayerGroupId(cid) == 8 then setPlayerGroupId(cid, 1) end if getCreatureOutfit(cid).lookType == 667 or getCreatureOutfit(cid).lookType == 999 then markPosEff(cid, getThingPos(cid)) sendMovementEffect(cid, 136, getThingPos(cid)) --edited efeito quando anda com o porygon end return true elseif skill == "ride" then out = false local pokemon = rides[getPokemonName(getCreatureSummons(cid)[1])] doChangeSpeed(cid, -getCreatureSpeed(cid)) local speed = 150 + PlayerSpeed + getSpeed(sid) * 5 * speedRate doChangeSpeed(cid, speed) setPlayerStorageValue(cid, 54844, speed) doSetCreatureOutfit(cid, {lookType = pokemon[1] + 351}, -1) doItemSetAttribute(getPlayerSlotItem(cid, 8).uid, "hp", getCreatureHealth(getCreatureSummons(cid)[1]) / getCreatureMaxHealth(getCreatureSummons(cid)[1])) if getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon2") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec2") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon3") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec3") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon4") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec4") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon5") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec5") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon6") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec6") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon7") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec7") end if out then local item = getPlayerSlotItem(cid, 8) local color1, color2, color3, color4 = getItemAttribute(item.uid, "color1"), getItemAttribute(item.uid, "color2"), getItemAttribute(item.uid, "color3"), getItemAttribute(item.uid, "color4") doSetCreatureOutfit(cid, {lookType = out, lookBody = color1, lookHead = color2, lookLegs = color3, lookFeet = color4}, -1) else --doSetCreatureOutfit(cid, {lookType = pokemon[1], lookHead = color1, lookBody = color2, lookLegs = color3, lookFeet = color4}, -1) doSetCreatureOutfit(cid, {lookType = pokemon[1] + 351}, -1) end doRemoveCreature(getCreatureSummons(cid)[1]) setPlayerStorageValue(cid, 17001, 1) if getPlayerGroupId(cid) == 8 then setPlayerGroupId(cid, 1) end return true end if getOwnerPos(sid).x ~= getThingPos(getCreatureMaster(sid)).x or getOwnerPos(sid).y ~= getThingPos(getCreatureMaster(sid)).y or isCreature(getCreatureTarget(getCreatureMaster(sid))) then doRegainSpeed(sid) markPos(sid, {x=1,y=1,z=7}) return true end addEvent(recheck, 120, sid) end
-
3 minutos atrás, boxxer321 disse:
aqui está:
function recheck(sid, skill, pos) if not isCreature(sid) then return end local cid = getCreatureMaster(sid) if skill == "cut" then local item = getTileItemById(pos, 2767) doCreatureSay(sid, "CUT!", TALKTYPE_ORANGE_1) markPos(sid, {x=1,y=1,z=7}) doFaceCreature(sid, pos) doSendMagicEffect(getThingPos(item.uid), 141) doTransformItem(item.uid, 6216) local function growBush() doTransformItem(getTileItemById(pos, 6216).uid, 2767) end addEvent(growBush, intervalToRegrowBushAndStones * 1000) elseif skill == "rock smash" then local item = getTileItemById(pos, 1285) doCreatureSay(sid, "ROCK SMASH!", TALKTYPE_ORANGE_1) markPos(sid, {x=1,y=1,z=7}) doFaceCreature(sid, pos) doSendMagicEffect(getThingPos(item.uid), 118) doTransformItem(item.uid, 3610) local function growRock() doTransformItem(getTileItemById(pos, 3610).uid, 1285) end addEvent(growRock, intervalToRegrowBushAndStones * 1000) elseif skill == "headbutt" then --alterado v1.6 local master = getCreatureMaster(sid) local array = {} for lvls, pokes in pairs(headbutt) do if getPlayerLevel(master) >= lvls[1] and getPlayerLevel(master) <= lvls[2] then array = pokes break end end if not next(array) then --proteçao para caso algum player tenha lvl maior q o limite da tabela, q ali ta 100k print("Some player have level bigger then 100k ") doPlayerSendTextMessage(cid, 20, "You can't have level bigger then 100k ") return true end local rand = array[math.random(#array)] for j = 1, rand[2] do local poke = doCreateMonster(rand[1], getClosestFreeTile(sid, pos), false) doSetMonsterPassive(poke) end local item = getTileItemById(pos, 12591) --id do item arvore normal doCreatureSay(sid, "HEADBUTT!", TALKTYPE_MONSTER) markPos(sid, {x=1,y=1,z=7}) doFaceCreature(sid, pos) doSendMagicEffect(getThingPos(item.uid), 118) doTransformItem(item.uid, 12592) --id do item arvore quebrada local function growHead() doTransformItem(getTileItemById(pos, 12592).uid, 12591) --id do item arvore quebrada, arvore normal end addEvent(growHead, choose(5, 10, 20, 30) * 60 * 1000) --o tempo pra arvore voltar ao normal varia de 5~30min elseif skill == "dig" then local item = getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}) doCreatureSay(sid, "DIG!", TALKTYPE_ORANGE_1) markPos(sid, {x=1,y=1,z=7}) doFaceCreature(sid, pos) doSendMagicEffect(getThingPos(item.uid), 3) doTransformItem(item.uid, item.itemid+1) local function closeHole() doTransformItem(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).uid, item.itemid) end addEvent(closeHole, intervalToRegrowBushAndStones * 1000) elseif skill == "fly" then --if not isPremium(cid) then --doPlayerSendCancel(cid, "Only premium members are allowed to fly.") --return true --end local pokemon = flys[getPokemonName(getCreatureSummons(cid)[1])] doPlayerSendTextMessage(cid, 27, "Type \"up\" or \"h1\" to fly higher and \"down\" or \"h2\" to fly lower.") doChangeSpeed(cid, -getCreatureSpeed(cid)) local speed = 500 + PlayerSpeed/5 + getSpeed(sid) * 6 * speedRate doChangeSpeed(cid, speed) setPlayerStorageValue(cid, 54844, speed) local go = false local pks = getCreatureSummons(cid)[1] if getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon2") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec2") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon3") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec3") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon4") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec4") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon5") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec5") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon6") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec6") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon7") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec7") end if go then local item = getPlayerSlotItem(cid, 8) local color1, color2, color3, color4 = getItemAttribute(item.uid, "color1"), getItemAttribute(item.uid, "color2"), getItemAttribute(item.uid, "color3"), getItemAttribute(item.uid, "color4") doSetCreatureOutfit(cid, {lookType = out, lookBody = color1, lookHead = color2, lookLegs = color3, lookFeet = color4}, -1) else --doSetCreatureOutfit(cid, {lookType = pokemon[1], lookHead = color1, lookBody = color2, lookLegs = color3, lookFeet = color4}, -1) doSetCreatureOutfit(cid, {lookType = pokemon[1] + 351}, -1) end --doSetCreatureOutfit(cid, {lookType = pokemon[1] + 351}, -1) doItemSetAttribute(getPlayerSlotItem(cid, 8).uid, "hp", getCreatureHealth(getCreatureSummons(cid)[1]) / getCreatureMaxHealth(getCreatureSummons(cid)[1])) doRemoveCreature(getCreatureSummons(cid)[1]) setPlayerStorageValue(cid, 17000, 1) if getPlayerGroupId(cid) == 8 then setPlayerGroupId(cid, 1) end if getCreatureOutfit(cid).lookType == 667 or getCreatureOutfit(cid).lookType == 999 then markPosEff(cid, getThingPos(cid)) sendMovementEffect(cid, 136, getThingPos(cid)) --edited efeito quando anda com o porygon end return true elseif skill == "ride" then local pokemon = rides[getPokemonName(getCreatureSummons(cid)[1])] doChangeSpeed(cid, -getCreatureSpeed(cid)) local speed = 150 + PlayerSpeed + getSpeed(sid) * 5 * speedRate doChangeSpeed(cid, speed) setPlayerStorageValue(cid, 54844, speed) doSetCreatureOutfit(cid, {lookType = pokemon[1] + 351}, -1) doItemSetAttribute(getPlayerSlotItem(cid, 8).uid, "hp", getCreatureHealth(getCreatureSummons(cid)[1]) / getCreatureMaxHealth(getCreatureSummons(cid)[1])) doRemoveCreature(getCreatureSummons(cid)[1]) setPlayerStorageValue(cid, 17001, 1) if getPlayerGroupId(cid) == 8 then setPlayerGroupId(cid, 1) end return true end if getOwnerPos(sid).x ~= getThingPos(getCreatureMaster(sid)).x or getOwnerPos(sid).y ~= getThingPos(getCreatureMaster(sid)).y or isCreature(getCreatureTarget(getCreatureMaster(sid))) then doRegainSpeed(sid) markPos(sid, {x=1,y=1,z=7}) return true end addEvent(recheck, 120, sid) end
Cara, parece tá tudo normal, testa isso no fly:
function recheck(sid, skill, pos) if not isCreature(sid) then return end local cid = getCreatureMaster(sid) if skill == "cut" then local item = getTileItemById(pos, 2767) doCreatureSay(sid, "CUT!", TALKTYPE_ORANGE_1) markPos(sid, {x=1,y=1,z=7}) doFaceCreature(sid, pos) doSendMagicEffect(getThingPos(item.uid), 141) doTransformItem(item.uid, 6216) local function growBush() doTransformItem(getTileItemById(pos, 6216).uid, 2767) end addEvent(growBush, intervalToRegrowBushAndStones * 1000) elseif skill == "rock smash" then local item = getTileItemById(pos, 1285) doCreatureSay(sid, "ROCK SMASH!", TALKTYPE_ORANGE_1) markPos(sid, {x=1,y=1,z=7}) doFaceCreature(sid, pos) doSendMagicEffect(getThingPos(item.uid), 118) doTransformItem(item.uid, 3610) local function growRock() doTransformItem(getTileItemById(pos, 3610).uid, 1285) end addEvent(growRock, intervalToRegrowBushAndStones * 1000) elseif skill == "headbutt" then --alterado v1.6 local master = getCreatureMaster(sid) local array = {} for lvls, pokes in pairs(headbutt) do if getPlayerLevel(master) >= lvls[1] and getPlayerLevel(master) <= lvls[2] then array = pokes break end end if not next(array) then --proteçao para caso algum player tenha lvl maior q o limite da tabela, q ali ta 100k print("Some player have level bigger then 100k ") doPlayerSendTextMessage(cid, 20, "You can't have level bigger then 100k ") return true end local rand = array[math.random(#array)] for j = 1, rand[2] do local poke = doCreateMonster(rand[1], getClosestFreeTile(sid, pos), false) doSetMonsterPassive(poke) end local item = getTileItemById(pos, 12591) --id do item arvore normal doCreatureSay(sid, "HEADBUTT!", TALKTYPE_MONSTER) markPos(sid, {x=1,y=1,z=7}) doFaceCreature(sid, pos) doSendMagicEffect(getThingPos(item.uid), 118) doTransformItem(item.uid, 12592) --id do item arvore quebrada local function growHead() doTransformItem(getTileItemById(pos, 12592).uid, 12591) --id do item arvore quebrada, arvore normal end addEvent(growHead, choose(5, 10, 20, 30) * 60 * 1000) --o tempo pra arvore voltar ao normal varia de 5~30min elseif skill == "dig" then local item = getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}) doCreatureSay(sid, "DIG!", TALKTYPE_ORANGE_1) markPos(sid, {x=1,y=1,z=7}) doFaceCreature(sid, pos) doSendMagicEffect(getThingPos(item.uid), 3) doTransformItem(item.uid, item.itemid+1) local function closeHole() doTransformItem(getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).uid, item.itemid) end addEvent(closeHole, intervalToRegrowBushAndStones * 1000) elseif skill == "fly" then --if not isPremium(cid) then --doPlayerSendCancel(cid, "Only premium members are allowed to fly.") --return true --end local pokemon = flys[getPokemonName(getCreatureSummons(cid)[1])] doPlayerSendTextMessage(cid, 27, "Type \"up\" or \"h1\" to fly higher and \"down\" or \"h2\" to fly lower.") doChangeSpeed(cid, -getCreatureSpeed(cid)) local speed = 500 + PlayerSpeed/5 + getSpeed(sid) * 6 * speedRate doChangeSpeed(cid, speed) setPlayerStorageValue(cid, 54844, speed) local go = false local pks = getCreatureSummons(cid)[1] if getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon2") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec2") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon3") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec3") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon4") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec4") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon5") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec5") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon6") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec6") elseif getCreatureOutfit(pks).lookType == getItemAttribute(getPlayerSlotItem(cid, 8).uid, "addon7") then go = true out = getItemAttribute(getPlayerSlotItem(cid, 8).uid, "spec7") end if out then local item = getPlayerSlotItem(cid, 8) local color1, color2, color3, color4 = getItemAttribute(item.uid, "color1"), getItemAttribute(item.uid, "color2"), getItemAttribute(item.uid, "color3"), getItemAttribute(item.uid, "color4") doSetCreatureOutfit(cid, {lookType = out, lookBody = color1, lookHead = color2, lookLegs = color3, lookFeet = color4}, -1) else --doSetCreatureOutfit(cid, {lookType = pokemon[1], lookHead = color1, lookBody = color2, lookLegs = color3, lookFeet = color4}, -1) doSetCreatureOutfit(cid, {lookType = pokemon[1] + 351}, -1) end --doSetCreatureOutfit(cid, {lookType = pokemon[1] + 351}, -1) doItemSetAttribute(getPlayerSlotItem(cid, 8).uid, "hp", getCreatureHealth(getCreatureSummons(cid)[1]) / getCreatureMaxHealth(getCreatureSummons(cid)[1])) doRemoveCreature(getCreatureSummons(cid)[1]) setPlayerStorageValue(cid, 17000, 1) if getPlayerGroupId(cid) == 8 then setPlayerGroupId(cid, 1) end if getCreatureOutfit(cid).lookType == 667 or getCreatureOutfit(cid).lookType == 999 then markPosEff(cid, getThingPos(cid)) sendMovementEffect(cid, 136, getThingPos(cid)) --edited efeito quando anda com o porygon end return true elseif skill == "ride" then local pokemon = rides[getPokemonName(getCreatureSummons(cid)[1])] doChangeSpeed(cid, -getCreatureSpeed(cid)) local speed = 150 + PlayerSpeed + getSpeed(sid) * 5 * speedRate doChangeSpeed(cid, speed) setPlayerStorageValue(cid, 54844, speed) doSetCreatureOutfit(cid, {lookType = pokemon[1] + 351}, -1) doItemSetAttribute(getPlayerSlotItem(cid, 8).uid, "hp", getCreatureHealth(getCreatureSummons(cid)[1]) / getCreatureMaxHealth(getCreatureSummons(cid)[1])) doRemoveCreature(getCreatureSummons(cid)[1]) setPlayerStorageValue(cid, 17001, 1) if getPlayerGroupId(cid) == 8 then setPlayerGroupId(cid, 1) end return true end if getOwnerPos(sid).x ~= getThingPos(getCreatureMaster(sid)).x or getOwnerPos(sid).y ~= getThingPos(getCreatureMaster(sid)).y or isCreature(getCreatureTarget(getCreatureMaster(sid))) then doRegainSpeed(sid) markPos(sid, {x=1,y=1,z=7}) return true end addEvent(recheck, 120, sid) end
-
Me manda a recheck
-
preciso da função goThere
-
2 minutos atrás, fhoenix00 disse:
Nada ainda
<?xml version="1.0" encoding="UTF-8"?>
<creaturescripts>
<event type="joinchannel" name="ShowPokedex" event="script" value="newpokedex.lua"/>
<event type="leavechannel" name="ClosePokedex" event="script" value="newpokedex.lua"/>
<event type="kill" name="pokemons" event="script" value="bosses.lua"/>
<event type="login" name="aloot_reg" event="script" value="aloot.lua"/>
<event type="kill" name="aloot_kill" event="script" value="aloot.lua"/>
<event type="kill" name="dropStone" script="dropStone.lua"/>
<event type="login" name="PlayerLogin" event="script" value="login.lua"/>
<event type="login" name="AntiMc" event="script" value="antimc.lua"/>
<event type="kill" name="ExpBonus" event="script" value="exp.lua"/>
<event type="login" name="ExpVip" event="script" value="vipexp.lua"/>
<event type="logout" name="flylogoutno" registerTo="player" event="script" value="Flylogout.lua"/>
<event type="logout" name="surflogoutno" registerTo="player" event="script" value="Surflogout.lua"/>
<event type="logout" name="ridelogoutno" registerTo="player" event="script" value="Ridelogout.lua"/>
<event type="death" name="ArticunoTeleport" script="tparticuno.lua"/><event type="death" name="tel" event="script" value="tel.lua"/>
<event type="receivemail" name="Mail" event="script" value="mail.lua"/>
<event type="reportbug" name="SaveReportBug" script="reportbug.lua"/>
<event type="think" name="Idle" event="script" value="idle.lua"/>
<event type="death" name="Experience" event="script" value="pokeexp.lua"/><event type="spawn" name="Spawn" event="script" value="spawn.lua"/>
<event type="think" name="t" event="script" value="wildpoke.lua"/>
<event type="think" name="PokemonIdle" event="script" value="poketele.lua"/>
<event type="statschange" name="GeneralConfiguration" event="script" value="exp2.0.lua"/>
<event type="advance" name="EffectOnAdvance" event="script" value="levelup.lua"/>
<event type="direction" name="DirectionSystem" event="script" value="wildpoke.lua"/>
<event type="attack" name="AttackSystem" event="script" value="wildpoke.lua"/>
<event type="cast" name="CastSystem" event="script" value="wildpoke.lua"/>
<event type="target" name="WildAttack" event="script" value="playerattack.lua"/>
<event type="death" name="tp1" event="script" value="Tp-Celebi.lua"/>
<event type="death" name="tp2" event="script" value="Tp-Heatran.lua"/>
<event type="death" name="tp3" event="script" value="Tp-Keldeo.lua"/>
<event type="death" name="tp4" event="script" value="Tp-Zekrom.lua"/>
<event type="death" name="tp5" event="script" value="Tp-Giratina.lua"/>
<event type="death" name="tp6" event="script" value="Tp-Arceus.lua"/>
<event type="death" name="tp7" event="script" value="Tp-Cresselia.lua"/>
<event type="death" name="tp8" event="script" value="Tp-Terrakion.lua"/>
<event type="death" name="tp9" event="script" value="Tp-Ho-oh.lua"/>
<event type="death" name="tp10" event="script" value="Tp-Cobalion.lua"/>
<event type="death" name="tp11" event="script" value="Tp-Reshiram.lua"/>
<event type="death" name="tp12" event="script" value="Tp-Genesect.lua"/>
<event type="look" name="LookSystem" event="script" value="look.lua"/>
<event type="death" name="SummonDeath" event="script" value="goback.lua"/>
<event type="logout" name="PlayerLogout" event="script" value="goback.lua"/>
<event type="traderequest" name="T2" event="script" value="trade system.lua"/><event type="tradeaccept" name="T1" event="script" value="trade system.lua"/>
</creaturescripts>
Ta ai
Utilize a opção
para postar seus códigos, por favor. -
Manda seu creaturescripts.xml
-
A linha do addon, esse número 15512 é algum item, ou a outfit do poke ?
[15512] = {stor = 200013, addon = 1824, spec = 1825}, -- Tauros 1
Ou no caso, qual parte dessa linha ai seria o ride/fly ?
-
A questão neste pedido foi encerrada por falta de respostas. Este tópico está fechado e foi movido para Pedido - Tópicos Sem Resposta.
+ Caso a dúvida/pedido não tenha sido resolvida você poderá criar outro tópico solicitando.
* Lembre-se que é permitido dar UP no tópico a cada 24 horas para assim o destacar e manter movimentado. -
A questão neste pedido foi encerrada por falta de respostas. Este tópico está fechado e foi movido para Pedido - Tópicos Sem Resposta.
+ Caso a dúvida/pedido não tenha sido resolvida você poderá criar outro tópico solicitando.
* Lembre-se que é permitido dar UP no tópico a cada 24 horas para assim o destacar e manter movimentado. -
A questão neste pedido foi encerrada por falta de respostas. Este tópico está fechado e foi movido para Pedido - Tópicos Sem Resposta.
+ Caso a dúvida/pedido não tenha sido resolvida você poderá criar outro tópico solicitando.
* Lembre-se que é permitido dar UP no tópico a cada 24 horas para assim o destacar e manter movimentado. -
O pedido neste tópico de foi atendido e/ou o autor do tópico resolveu sua duvida. Este tópico está fechado e foi movido para Pedidos - Resolvidos. Se você tiver outros pedidos, crie um novo tópico.
-
A questão neste pedido foi encerrada por falta de respostas. Este tópico está fechado e foi movido para Pedido - Tópicos Sem Resposta.
+ Caso a dúvida/pedido não tenha sido resolvida você poderá criar outro tópico solicitando.
* Lembre-se que é permitido dar UP no tópico a cada 24 horas para assim o destacar e manter movimentado. -
A questão neste pedido foi encerrada por falta de respostas. Este tópico está fechado e foi movido para Pedido - Tópicos Sem Resposta.
+ Caso a dúvida/pedido não tenha sido resolvida você poderá criar outro tópico solicitando.
* Lembre-se que é permitido dar UP no tópico a cada 24 horas para assim o destacar e manter movimentado. -
A questão neste pedido foi encerrada por falta de respostas. Este tópico está fechado e foi movido para Pedido - Tópicos Sem Resposta.
+ Caso a dúvida/pedido não tenha sido resolvida você poderá criar outro tópico solicitando.
* Lembre-se que é permitido dar UP no tópico a cada 24 horas para assim o destacar e manter movimentado. -
A questão neste pedido foi encerrada por falta de respostas. Este tópico está fechado e foi movido para Pedido - Tópicos Sem Resposta.
+ Caso a dúvida/pedido não tenha sido resolvida você poderá criar outro tópico solicitando.
* Lembre-se que é permitido dar UP no tópico a cada 24 horas para assim o destacar e manter movimentado. -
A questão neste pedido foi encerrada por falta de respostas. Este tópico está fechado e foi movido para Pedido - Tópicos Sem Resposta.
+ Caso a dúvida/pedido não tenha sido resolvida você poderá criar outro tópico solicitando.
* Lembre-se que é permitido dar UP no tópico a cada 24 horas para assim o destacar e manter movimentado.
-
Quem Está Navegando 0 membros estão online
- Nenhum usuário registrado visualizando esta página.
[Resolvido] Cores nos Nomes Source
em Resolvidos
Postado
Tem que compilar as sources
Mesmo arquivo