Ir para conteúdo

Fly System (Tibia,Nto,Wodbo) Tfs 0.3.6


zude96

Posts Recomendados

Eae Galera Do Xtibia Bom Esse é o Meu Primeiro Post De  Um Conteudo Pra Vocês Bom, Como Esse Sistema Funciona ? O Player Vai Digitar o Comando !fly e em Seguinda ele Fala Fly up Pra Subir Pra Descer é o Fly Down

 

Vá em Data/lib e Crie um Arquivo Chamando 075-fly.lua e Cole Isso Dentro

 

Spoiler

FLY_STORAGE = getConfigValue("flyStorage")

flyBlackSQM = false
nonFlyableBorder = {7576, 7577}
changeSpeed = true
flySpeed = 800
waterSpeed = 150

ITEM_FLYTILE = 460
ITEM_WATERTILE = 4625
FLY_OUTFIT = {lookType = 239, lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 0}
WATER = {4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619}

RANGEX = 1
RANGEY = 1 

ret =
{
"You are now flying.",
"You are not flying anymore.",
"You cannot stop flying here.",
"You are not flying.",
"You cannot up here.",
"You cannot down here.",
"You cannot go to there."
}

storPos = {x = 1200, y = 1201, z = 1202}

function isWalkable(pos, creature, proj, pz)
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false, true end
local n = not proj and 3 or 2
for i = 0, 255 do
pos.stackpos = i
local tile = getTileThingByPos(pos)
if tile.itemid ~= 0 and not isCreature(tile.uid) then
if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
return false
end
end
end
return true
end

function getAreaToRemove(pos1, pos2)
local t = getDirectionTo(pos1, pos2)
local pos =
{
[0] =
{
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z},
{x = pos1.x, y = pos1.y + 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z}
},
[2] =
{
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x, y = pos1.y - 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z}
},
[1] =
{
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z}
},
[3] =
{
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y, z = pos1.z},
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z}
},
[7] =
{
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z},
{x = pos1.x, y = pos1.y + 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z}
},
[6] = 
{
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y, z = pos1.z},
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z},
{x = pos1.x, y = pos1.y + 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z}
},
[5] =
{
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z},
{x = pos1.x, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z}
},
[4] =
{
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y, z = pos1.z},
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z}
}
}
return pos[t]
end

function doCreateTile(pos)
doAreaCombatHealth(0, 0, pos, 0, 0, 0, 255)
end

 

Agora Vá em Data/Talkactions e Crie Um Arquivo Chamado fly.lua e Cole Isso Dentro

 

Spoiler

function onSay(cid, words, param)

local pos = getCreaturePosition(cid)
pos.stackpos = 0

if(words == "!fly") then
if getCreatureStorage(cid, FLY_STORAGE) > 0 then
if not isWalkable(getCreaturePosition(cid)) or getThingFromPos(pos).itemid == ITEM_FLYTILE or getThingFromPos(pos).itemid == ITEM_WATERTILE then
doPlayerSendCancel(cid, ret[3])
return true
end
doChangeSpeed(cid, -getCreatureSpeed(cid) + getCreatureBaseSpeed(cid))
doCreatureSetStorage(cid, FLY_STORAGE, 0)
doRemoveCondition(cid, CONDITION_OUTFIT)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, ret[2])
return true
else
doCreatureSetStorage(cid, FLY_STORAGE, 1)
doRemoveConditions(cid, true)
doSetCreatureOutfit(cid, FLY_OUTFIT, -1)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, ret[1])
if changeSpeed then
doChangeSpeed(cid, flySpeed)
end
return true
end
elseif(words == "fly") then
if param == "up" then

pos.z = pos.z - 1
doCreateTile(pos)
if getCreatureStorage(cid, FLY_STORAGE) < 1 then
doPlayerSendCancel(cid, ret[4])
return true
end
if(getCreaturePosition(cid).z == 0) or (getThingFromPos(pos).itemid ~= ITEM_FLYTILE and getThingFromPos(pos).itemid > 0) or (getTileInfo(pos).house) then
doPlayerSendCancel(cid, ret[5])
return true
end
local tpos = pos
tpos.stackpos = 253
if isCreature(getThingFromPos(tpos).uid) then
doPlayerSendCancel(cid, ret[5])
return true
end

local toCreate = {}
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid < 1 then
table.insert(toCreate, area)
end
end
if getThingFromPos(pos).itemid < 1 then
for _, create in ipairs(toCreate) do
create.stackpos = 0
doCreateItem(ITEM_FLYTILE, 1, create)
end
doTeleportThing(cid, pos)
if changeSpeed then
doChangeSpeed(cid, flySpeed)
end
pos.z = pos.z + 1
doSendMagicEffect(pos, CONST_ME_BLOCKHIT)
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid == ITEM_FLYTILE then
doRemoveItem(thing.uid)
elseif thing.itemid == ITEM_WATERTILE then
doTransformItem(thing.uid, WATER[1])
end
end
else
doPlayerSendCancel(cid, ret[7])
end

elseif param == "down" then

pos.z = pos.z + 1
doCreateTile(pos)
if getCreatureStorage(cid, FLY_STORAGE) < 1 then
doPlayerSendCancel(cid, ret[4])
return true
end
if getCreaturePosition(cid).z == 14 then
doPlayerSendCancel(cid, ret[6])
return true
end
if(getTileInfo(pos).house) then
doPlayerSendCancel(cid, ret[6])
return true
end
local cpos = getCreaturePosition(cid)
cpos.stackpos = 0
if getThingFromPos(cpos).itemid ~= ITEM_FLYTILE then
doPlayerSendCancel(cid, ret[6])
return true
end
local tpos = pos
tpos.stackpos = 253
if isCreature(getThingFromPos(tpos).uid) then
doPlayerSendCancel(cid, ret[6])
return true
end

local toCreate = {}
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
doCreateTile(area) 
local thing = getThingFromPos(area)
if(thing.itemid < 1 or isInArray(WATER, thing.itemid)) then
table.insert(toCreate, area) 
end
end

local x = false
if isWalkable(pos) or getThingFromPos(pos).itemid < 1 or isInArray(WATER, getThingFromPos(pos).itemid) then
for _, create in ipairs(toCreate) do
if isInArray(WATER, getThingFromPos(create).itemid) then
doTransformItem(getThingFromPos(create).uid, ITEM_WATERTILE)
x = (create.z == pos.z and true or false)
else
doCreateItem(ITEM_FLYTILE, 1, create)
end
end
doTeleportThing(cid, pos)
doSendMagicEffect(pos, (x and CONST_ME_WATERSPLASH or getThingFromPos(pos).itemid == ITEM_WATERTILE and CONST_ME_WATERSPLASH or CONST_ME_NONE))
if changeSpeed then
doChangeSpeed(cid, (x and (-getCreatureSpeed(cid) + waterSpeed + getCreatureBaseSpeed(cid)) or (-getCreatureSpeed(cid) + flySpeed + getCreatureBaseSpeed(cid))))
end
pos.z = pos.z - 1
doSendMagicEffect(pos, CONST_ME_BLOCKHIT)
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
local thing = getThingFromPos(area)
if thing.itemid == ITEM_FLYTILE then
doRemoveItem(thing.uid)
end
end
else
doPlayerSendCancel(cid, ret[7])
end
end
end
return true
end

 

Agora Vá em Data/Movements/Scripts e Crie um Arquivo Chamado fly.lua e Cole Isso Dentro

 

Spoiler

function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)


if isInArray({ITEM_FLYTILE, ITEM_WATERTILE}, item.itemid) then

if not isPlayer(cid) then
doTeleportThing(cid, fromPosition)
return true
end
if getCreatureStorage(cid, FLY_STORAGE) < 1 then
doPlayerSendCancel(cid, ret[4])
doTeleportThing(cid, fromPosition)
return true
end 

local toPos = toPosition
toPos.stackpos = 0
if not flyBlackSQM then
toPos.z = 7
doCreateTile(toPos)
if getThingFromPos(toPos).itemid < 1 or getThingFromPos(toPos).itemid == ITEM_FLYTILE then
doTeleportThing(cid, fromPosition)
return true
end
toPos.z = toPosition.z
end

if(getTileInfo(toPos).house) then
doTeleportThing(cid, fromPosition)
return true
end

if nonFlyableBorder and type(nonFlyableBorder) == "table" then
for i = toPos.z, 14 do
toPos.z = i
toPos.stackpos = 1
doCreateTile(toPos)
if isInArray(nonFlyableBorder, getThingFromPos(toPos).itemid) then
doTeleportThing(cid, fromPosition)
return true
end
end
toPos.z = getCreaturePosition(cid).z
toPos.stackpos = 0
end
for _, area in ipairs(getArea(toPos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid < 1 or thing.itemid == ITEM_FLYTILE then
doCreateItem(ITEM_FLYTILE, 1, area)
elseif thing.itemid == ITEM_WATERTILE or isInArray(WATER, thing.itemid) then
doTransformItem(thing.uid, ITEM_WATERTILE)
end
end
end
return true
end

function onStepOut(cid, item, position, lastPosition, fromPosition, toPosition, actor)

local area = getAreaToRemove(fromPosition, toPosition)
for _, arear in ipairs(area) do
doCreateTile(arear)
local thing = getThingFromPos(arear)
if thing.itemid == ITEM_FLYTILE then
doRemoveItem(thing.uid)
elseif thing.itemid == ITEM_WATERTILE then
doTransformItem(thing.uid, WATER[1])
end
end
return true
end 

 

feito Isso Vá em Data/creaturescripts/scripts/ e vá no login.lua e coloque essa Função

 

Spoiler

function onLogin(cid)

if getCreatureStorage(cid, FLY_STORAGE) > 0 then
local storpos = {x = getCreatureStorage(cid, storPos.x), y = getCreatureStorage(cid, storPos.y), z = getCreatureStorage(cid, storPos.z), stackpos = 0}
doCreateTile(storpos)
local thing = getThingFromPos(storpos)
if thing.itemid < 1 or isInArray(WATER, thing.itemid) then
for _, area in ipairs(getArea(storpos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid < 1 then
doCreateItem(ITEM_FLYTILE, 1, area)
elseif isInArray(WATER, getThingFromPos(area).itemid) then
doTransformItem(getThingFromPos(area).uid, ITEM_WATERTILE)
end
end
end
doRemoveConditions(cid, true)
doSetCreatureOutfit(cid, FLY_OUTFIT, -1)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You are now flying.")
doTeleportThing(cid, storpos)
return true
end
end

 

e Essa Aqui Tambem

 

Spoiler

registerCreatureEvent(cid, "PlayerLogout")

 

Agora Crie Um Arquivo No CreatureScripts Com O Nome De logout.lua e Cole Isso Dentro

 

Spoiler

function onLogout(cid)

if getCreatureStorage(cid, FLY_STORAGE) > 0 then
local pos = getCreaturePosition(cid)
pos.stackpos = 0
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid == ITEM_FLYTILE then
doRemoveItem(thing.uid)
elseif thing.itemid == ITEM_WATERTILE then
doTransformItem(thing.uid, WATER[1])
end
end
doCreatureSetStorage(cid, storPos.x, pos.x)
doCreatureSetStorage(cid, storPos.y, pos.y)
doCreatureSetStorage(cid, storPos.z, pos.z)
end
return true
end

 

Agora Vá no Talkactions.xml e Cole Isso Dentro

 

Spoiler

<talkaction words="!fly;fly" case-sensitive="no" event="script" value="fly.lua"/>

 

Em Seguida Vá no Movements.xml e Cole Isso Dentro

 

Spoiler

<movevent type="StepIn" itemid="460" event="script" value="fly.lua"/>
<movevent type="StepOut" itemid="460" event="script" value="fly.lua"/>
<movevent type="StepIn" itemid="4609-4619" event="script" value="fly.lua"/>
<movevent type="StepIn" itemid="4625" event="script" value="fly.lua"/>

 

Agora em creaturescripts.xml e Cole isso

 

Spoiler

<event type="logout" name="PlayerLogout" event="script" value="logout.lua"/>

 

Agora o Trabalho Vai Ser Nas Sources Vá no game.cpp e Procure Por Essa Função

 

Spoiler

bool Game::combatBlockHit(CombatType_t combatType, Creature* attacker, Creature* target,
int32_t& healthChange, bool checkDefense, bool checkArmor)

 

Substitua Por Essa

 

Spoiler

bool Game::combatBlockHit(CombatType_t combatType, Creature* attacker, Creature* target,
int32_t& healthChange, bool checkDefense, bool checkArmor)
{
if(healthChange > 0)
return false;

const Position& targetPos = target->getPosition();
const SpectatorVec& list = getSpectators(targetPos);
if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
{
std::string value;
MagicEffect_t eff = MAGIC_EFFECT_POFF;
if(target->getStorage(g_config.getNumber(ConfigManager::FLY_STORAGE), value) && atoi(value.c_str()) > 0)
eff = MAGIC_EFFECT_NONE; 

addMagicEffect(list, targetPos, eff, target->isGhost());
return true;

}

int32_t damage = -healthChange;
BlockType_t blockType = target->blockHit(attacker, combatType, damage, checkDefense, checkArmor);

healthChange = -damage;
if(blockType == BLOCK_DEFENSE)
{
addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);
return true;
}
else if(blockType == BLOCK_ARMOR)
{
addMagicEffect(list, targetPos, MAGIC_EFFECT_BLOCKHIT);
return true;
}
else if(blockType != BLOCK_IMMUNITY)
return false;

MagicEffect_t effect = MAGIC_EFFECT_NONE;
switch(combatType)
{
case COMBAT_UNDEFINEDDAMAGE:
break;

case COMBAT_ENERGYDAMAGE:
case COMBAT_FIREDAMAGE:
case COMBAT_PHYSICALDAMAGE:
case COMBAT_ICEDAMAGE:
case COMBAT_DEATHDAMAGE:
case COMBAT_EARTHDAMAGE:
case COMBAT_HOLYDAMAGE:
{
effect = MAGIC_EFFECT_BLOCKHIT;
break;
}

default:
{
effect = MAGIC_EFFECT_POFF;
std::string value;
if(target->getStorage(g_config.getNumber(ConfigManager::FLY_STORAGE), value) && atoi(value.c_str()) > 0)
effect = MAGIC_EFFECT_NONE;

break;

}
}

addMagicEffect(list, targetPos, effect);
return true;
}

 

Ainda em game.cpp Procure por Essa Função

 

Spoiler

bool Game::combatChangeHealth(CombatType_t combatType, Creature* attacker, Creature* target, int32_t healthChange,
MagicEffect_t hitEffect/* = MAGIC_EFFECT_UNKNOWN*/, TextColor_t hitColor/* = TEXTCOLOR_UNKNOWN*/, bool force/* = false*/)

 

e Substitua Por Essa 

 

Spoiler

bool Game::combatChangeHealth(CombatType_t combatType, Creature* attacker, Creature* target, int32_t healthChange,
MagicEffect_t hitEffect/* = MAGIC_EFFECT_UNKNOWN*/, TextColor_t hitColor/* = TEXTCOLOR_UNKNOWN*/, bool force/* = false*/)
{
const Position& targetPos = target->getPosition();
if(healthChange > 0)
{
if(!force && target->getHealth() <= 0)
return false;

bool deny = false;
CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
{
if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_HEALTHGAIN, combatType, healthChange))
deny = true;
}

if(deny)
return false;

target->gainHealth(attacker, healthChange);
if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&
(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))
{
char buffer[20];
sprintf(buffer, "+%d", healthChange);

const SpectatorVec& list = getSpectators(targetPos);
if(combatType != COMBAT_HEALING)
addMagicEffect(list, targetPos, MAGIC_EFFECT_WRAPS_BLUE);

addAnimatedText(list, targetPos, TEXTCOLOR_GREEN, buffer);
}
}
else
{
const SpectatorVec& list = getSpectators(targetPos);
if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
{
std::string value;
MagicEffect_t eff = MAGIC_EFFECT_POFF;
if(target->getStorage(g_config.getNumber(ConfigManager::FLY_STORAGE), value) && atoi(value.c_str()) > 0)
eff = MAGIC_EFFECT_NONE;

addMagicEffect(list, targetPos, eff);
return true;

}

int32_t damage = -healthChange;
if(damage != 0)
{
if(target->hasCondition(CONDITION_MANASHIELD) && combatType != COMBAT_UNDEFINEDDAMAGE)
{
int32_t manaDamage = std::min(target->getMana(), damage);
damage = std::max((int32_t)0, damage - manaDamage);
if(manaDamage != 0)
{
bool deny = false;
CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
{
if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, combatType, manaDamage))
deny = true;
}

if(deny)
return false;

target->drainMana(attacker, combatType, manaDamage);
char buffer[20];
sprintf(buffer, "%d", manaDamage);

addMagicEffect(list, targetPos, MAGIC_EFFECT_LOSE_ENERGY);
addAnimatedText(list, targetPos, TEXTCOLOR_BLUE, buffer);
}
}

damage = std::min(target->getHealth(), damage);
if(damage > 0)
{
bool deny = false;
CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
{
if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_HEALTHLOSS, combatType, damage))
deny = true;
}

if(deny)
return false;

target->drainHealth(attacker, combatType, damage);
addCreatureHealth(list, target);

TextColor_t textColor = TEXTCOLOR_NONE;
MagicEffect_t magicEffect = MAGIC_EFFECT_NONE;
switch(combatType)
{
case COMBAT_PHYSICALDAMAGE:
{
Item* splash = NULL;
switch(target->getRace())
{
case RACE_VENOM:
textColor = TEXTCOLOR_LIGHTGREEN;
magicEffect = MAGIC_EFFECT_POISON;
splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_GREEN);
break;

case RACE_BLOOD:
textColor = TEXTCOLOR_RED;
magicEffect = MAGIC_EFFECT_DRAW_BLOOD;
splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_BLOOD);
break;

case RACE_UNDEAD:
textColor = TEXTCOLOR_GREY;
magicEffect = MAGIC_EFFECT_HIT_AREA;
break;

case RACE_FIRE:
textColor = TEXTCOLOR_ORANGE;
magicEffect = MAGIC_EFFECT_DRAW_BLOOD;
break;

case RACE_ENERGY:
textColor = TEXTCOLOR_PURPLE;
magicEffect = MAGIC_EFFECT_PURPLEENERGY;
break;

default:
break;
}

if(splash)
{
internalAddItem(NULL, target->getTile(), splash, INDEX_WHEREEVER, FLAG_NOLIMIT);
startDecay(splash);
}
break;
}

case COMBAT_ENERGYDAMAGE:
{
textColor = TEXTCOLOR_PURPLE;
magicEffect = MAGIC_EFFECT_ENERGY_DAMAGE;
break;
}

case COMBAT_EARTHDAMAGE:
{
textColor = TEXTCOLOR_LIGHTGREEN;
magicEffect = MAGIC_EFFECT_POISON_RINGS;
break;
}

case COMBAT_DROWNDAMAGE:
{
textColor = TEXTCOLOR_LIGHTBLUE;
magicEffect = MAGIC_EFFECT_LOSE_ENERGY;
break;
}

case COMBAT_FIREDAMAGE:
{
textColor = TEXTCOLOR_ORANGE;
magicEffect = MAGIC_EFFECT_HITBY_FIRE;
break;
}

case COMBAT_ICEDAMAGE:
{
textColor = TEXTCOLOR_TEAL;
magicEffect = MAGIC_EFFECT_ICEATTACK;
break;
}

case COMBAT_HOLYDAMAGE:
{
textColor = TEXTCOLOR_YELLOW;
magicEffect = MAGIC_EFFECT_HOLYDAMAGE;
break;
}

case COMBAT_DEATHDAMAGE:
{
textColor = TEXTCOLOR_DARKRED;
magicEffect = MAGIC_EFFECT_SMALLCLOUDS;
break;
}

case COMBAT_LIFEDRAIN:
{
textColor = TEXTCOLOR_RED;
magicEffect = MAGIC_EFFECT_WRAPS_RED;
break;
}

default:
break;
}

if(hitEffect != MAGIC_EFFECT_UNKNOWN)
magicEffect = hitEffect;

if(hitColor != TEXTCOLOR_UNKNOWN)
textColor = hitColor;

if(textColor < TEXTCOLOR_NONE && magicEffect < MAGIC_EFFECT_NONE)
{
char buffer[20];
sprintf(buffer, "%d", damage);

addMagicEffect(list, targetPos, magicEffect);
addAnimatedText(list, targetPos, textColor, buffer);
}
}
}
}

return true;
}

 

Agora Procure Por Essa Função

 

Spoiler

bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange)

 

Substitua Por Essa

 

Spoiler

bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange)
 { const Position& targetPos = target->getPosition();
 if(manaChange > 0)
 {
 bool deny = false; 
 CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
 for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
 {
 if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANAGAIN, COMBAT_HEALING, manaChange))
 deny = true;
 }
 if(deny)
 return false;
 target->changeMana(manaChange);
 if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&
 (g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))
 {
 char buffer[20];
 sprintf(buffer, "+%d", manaChange);
 const SpectatorVec& list = getSpectators(targetPos);
 addAnimatedText(list, targetPos, TEXTCOLOR_DARKPURPLE, buffer);
 }
 }
 else 
 { 
 const SpectatorVec& list = getSpectators(targetPos);
 if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
 {
 std::string value;
 MagicEffect_t eff = MAGIC_EFFECT_POFF;
 if(target->getStorage(g_config.getNumber(ConfigManager::FLY_STORAGE), value) && atoi(value.c_str()) > 0)
 eff = MAGIC_EFFECT_NONE;
 
 addMagicEffect(list, targetPos, eff);
 return false;
 }
 int32_t manaLoss = std::min(target->getMana(), -manaChange);
 BlockType_t blockType = target->blockHit(attacker, COMBAT_MANADRAIN, manaLoss);
 if(blockType != BLOCK_NONE)
 {
 addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);
 return false;
 }
 if(manaLoss > 0)
 { bool deny = false;
 CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
 for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
 {
 if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, COMBAT_UNDEFINEDDAMAGE, manaChange))
 deny = true;
 }
 if(deny)
 return false;
 
 target->drainMana(attacker, COMBAT_MANADRAIN, manaLoss);
 char buffer[20];
 sprintf(buffer, "%d", manaLoss);
 addAnimatedText(list, targetPos, TEXTCOLOR_BLUE, buffer);
 
 }
 
 } 
 
 return true;
 
 }

 

Agora vá em configmanager.cpp e procure por essa Função

 

Spoiler

m_confBool[ADDONS_PREMIUM] = getGlobalBool("addonsOnlyPremium", true);

 

e em baixo dela Adicione iSSO

 

Spoiler

m_confNumber[FLY_STORAGE] = getGlobalNumber("flyStorage", 0);

 

Agora Vá em configmanager.h e Procure por Essa Função

 

Spoiler

HOUSE_CLEAN_OLD

 

e em baixo dela Adicione Isso

 

Spoiler

FLY_STORAGE,

 

E Pra Terminar Adicione Essa Storage no Config.lua

 

Spoiler

flyStorage = 65535

 

Como esse Foi Meu Primeiro Post Então Não Tenho Muita Experiencia Aqui, Não Consegui por o Gif, Mais Vou Por Link Das Imagens Do Fly up e Down

 

 

Pra Configurar a Outfit Que Fica após vc digitar o Comando !fly, Vá em Data/lib 075-fly.lua e altere Nessa Linha

 

Spoiler

FLY_OUTFIT = {lookType = 239, lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 0}

 

Creditos:

Otland.net

Darkhaos

Editado por zude96
Link para o comentário
Compartilhar em outros sites

12 minutos atrás, zude96 disse:

Eae Galera Do Xtibia Bom Esse é o Meu Primeiro Post De  Um Conteudo Pra Vocês Bom, Como Esse Sistema Funciona ? O Player Vai Digitar o Comando !fly e em Seguinda ele Fala Fly up Pra Subir Pra Descer é o Fly Down

 

Vá em Data/lib e Crie um Arquivo Chamando 075-fly.lua e Cole Isso Dentro

 

  Mostrar conteúdo oculto

FLY_STORAGE = getConfigValue("flyStorage")

flyBlackSQM = false
nonFlyableBorder = {7576, 7577}
changeSpeed = true
flySpeed = 800
waterSpeed = 150

ITEM_FLYTILE = 460
ITEM_WATERTILE = 4625
FLY_OUTFIT = {lookType = 239, lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 0}
WATER = {4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619}

RANGEX = 1
RANGEY = 1 

ret =
{
"You are now flying.",
"You are not flying anymore.",
"You cannot stop flying here.",
"You are not flying.",
"You cannot up here.",
"You cannot down here.",
"You cannot go to there."
}

storPos = {x = 1200, y = 1201, z = 1202}

function isWalkable(pos, creature, proj, pz)
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false, true end
local n = not proj and 3 or 2
for i = 0, 255 do
pos.stackpos = i
local tile = getTileThingByPos(pos)
if tile.itemid ~= 0 and not isCreature(tile.uid) then
if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
return false
end
end
end
return true
end

function getAreaToRemove(pos1, pos2)
local t = getDirectionTo(pos1, pos2)
local pos =
{
[0] =
{
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z},
{x = pos1.x, y = pos1.y + 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z}
},
[2] =
{
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x, y = pos1.y - 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z}
},
[1] =
{
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z}
},
[3] =
{
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y, z = pos1.z},
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z}
},
[7] =
{
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z},
{x = pos1.x, y = pos1.y + 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z}
},
[6] = 
{
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y, z = pos1.z},
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z},
{x = pos1.x, y = pos1.y + 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z}
},
[5] =
{
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z},
{x = pos1.x, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z}
},
[4] =
{
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y, z = pos1.z},
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z}
}
}
return pos[t]
end

function doCreateTile(pos)
doAreaCombatHealth(0, 0, pos, 0, 0, 0, 255)
end

 

Agora Vá em Data/Talkactions e Crie Um Arquivo Chamado fly.lua e Cole Isso Dentro

 

  Mostrar conteúdo oculto

function onSay(cid, words, param)

local pos = getCreaturePosition(cid)
pos.stackpos = 0

if(words == "!fly") then
if getCreatureStorage(cid, FLY_STORAGE) > 0 then
if not isWalkable(getCreaturePosition(cid)) or getThingFromPos(pos).itemid == ITEM_FLYTILE or getThingFromPos(pos).itemid == ITEM_WATERTILE then
doPlayerSendCancel(cid, ret[3])
return true
end
doChangeSpeed(cid, -getCreatureSpeed(cid) + getCreatureBaseSpeed(cid))
doCreatureSetStorage(cid, FLY_STORAGE, 0)
doRemoveCondition(cid, CONDITION_OUTFIT)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, ret[2])
return true
else
doCreatureSetStorage(cid, FLY_STORAGE, 1)
doRemoveConditions(cid, true)
doSetCreatureOutfit(cid, FLY_OUTFIT, -1)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, ret[1])
if changeSpeed then
doChangeSpeed(cid, flySpeed)
end
return true
end
elseif(words == "fly") then
if param == "up" then

pos.z = pos.z - 1
doCreateTile(pos)
if getCreatureStorage(cid, FLY_STORAGE) < 1 then
doPlayerSendCancel(cid, ret[4])
return true
end
if(getCreaturePosition(cid).z == 0) or (getThingFromPos(pos).itemid ~= ITEM_FLYTILE and getThingFromPos(pos).itemid > 0) or (getTileInfo(pos).house) then
doPlayerSendCancel(cid, ret[5])
return true
end
local tpos = pos
tpos.stackpos = 253
if isCreature(getThingFromPos(tpos).uid) then
doPlayerSendCancel(cid, ret[5])
return true
end

local toCreate = {}
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid < 1 then
table.insert(toCreate, area)
end
end
if getThingFromPos(pos).itemid < 1 then
for _, create in ipairs(toCreate) do
create.stackpos = 0
doCreateItem(ITEM_FLYTILE, 1, create)
end
doTeleportThing(cid, pos)
if changeSpeed then
doChangeSpeed(cid, flySpeed)
end
pos.z = pos.z + 1
doSendMagicEffect(pos, CONST_ME_BLOCKHIT)
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid == ITEM_FLYTILE then
doRemoveItem(thing.uid)
elseif thing.itemid == ITEM_WATERTILE then
doTransformItem(thing.uid, WATER[1])
end
end
else
doPlayerSendCancel(cid, ret[7])
end

elseif param == "down" then

pos.z = pos.z + 1
doCreateTile(pos)
if getCreatureStorage(cid, FLY_STORAGE) < 1 then
doPlayerSendCancel(cid, ret[4])
return true
end
if getCreaturePosition(cid).z == 14 then
doPlayerSendCancel(cid, ret[6])
return true
end
if(getTileInfo(pos).house) then
doPlayerSendCancel(cid, ret[6])
return true
end
local cpos = getCreaturePosition(cid)
cpos.stackpos = 0
if getThingFromPos(cpos).itemid ~= ITEM_FLYTILE then
doPlayerSendCancel(cid, ret[6])
return true
end
local tpos = pos
tpos.stackpos = 253
if isCreature(getThingFromPos(tpos).uid) then
doPlayerSendCancel(cid, ret[6])
return true
end

local toCreate = {}
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
doCreateTile(area) 
local thing = getThingFromPos(area)
if(thing.itemid < 1 or isInArray(WATER, thing.itemid)) then
table.insert(toCreate, area) 
end
end

local x = false
if isWalkable(pos) or getThingFromPos(pos).itemid < 1 or isInArray(WATER, getThingFromPos(pos).itemid) then
for _, create in ipairs(toCreate) do
if isInArray(WATER, getThingFromPos(create).itemid) then
doTransformItem(getThingFromPos(create).uid, ITEM_WATERTILE)
x = (create.z == pos.z and true or false)
else
doCreateItem(ITEM_FLYTILE, 1, create)
end
end
doTeleportThing(cid, pos)
doSendMagicEffect(pos, (x and CONST_ME_WATERSPLASH or getThingFromPos(pos).itemid == ITEM_WATERTILE and CONST_ME_WATERSPLASH or CONST_ME_NONE))
if changeSpeed then
doChangeSpeed(cid, (x and (-getCreatureSpeed(cid) + waterSpeed + getCreatureBaseSpeed(cid)) or (-getCreatureSpeed(cid) + flySpeed + getCreatureBaseSpeed(cid))))
end
pos.z = pos.z - 1
doSendMagicEffect(pos, CONST_ME_BLOCKHIT)
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
local thing = getThingFromPos(area)
if thing.itemid == ITEM_FLYTILE then
doRemoveItem(thing.uid)
end
end
else
doPlayerSendCancel(cid, ret[7])
end
end
end
return true
end

 

Agora Vá em Data/Movements/Scripts e Crie um Arquivo Chamado fly.lua e Cole Isso Dentro

 

  Mostrar conteúdo oculto

function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)


if isInArray({ITEM_FLYTILE, ITEM_WATERTILE}, item.itemid) then

if not isPlayer(cid) then
doTeleportThing(cid, fromPosition)
return true
end
if getCreatureStorage(cid, FLY_STORAGE) < 1 then
doPlayerSendCancel(cid, ret[4])
doTeleportThing(cid, fromPosition)
return true
end 

local toPos = toPosition
toPos.stackpos = 0
if not flyBlackSQM then
toPos.z = 7
doCreateTile(toPos)
if getThingFromPos(toPos).itemid < 1 or getThingFromPos(toPos).itemid == ITEM_FLYTILE then
doTeleportThing(cid, fromPosition)
return true
end
toPos.z = toPosition.z
end

if(getTileInfo(toPos).house) then
doTeleportThing(cid, fromPosition)
return true
end

if nonFlyableBorder and type(nonFlyableBorder) == "table" then
for i = toPos.z, 14 do
toPos.z = i
toPos.stackpos = 1
doCreateTile(toPos)
if isInArray(nonFlyableBorder, getThingFromPos(toPos).itemid) then
doTeleportThing(cid, fromPosition)
return true
end
end
toPos.z = getCreaturePosition(cid).z
toPos.stackpos = 0
end
for _, area in ipairs(getArea(toPos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid < 1 or thing.itemid == ITEM_FLYTILE then
doCreateItem(ITEM_FLYTILE, 1, area)
elseif thing.itemid == ITEM_WATERTILE or isInArray(WATER, thing.itemid) then
doTransformItem(thing.uid, ITEM_WATERTILE)
end
end
end
return true
end

function onStepOut(cid, item, position, lastPosition, fromPosition, toPosition, actor)

local area = getAreaToRemove(fromPosition, toPosition)
for _, arear in ipairs(area) do
doCreateTile(arear)
local thing = getThingFromPos(arear)
if thing.itemid == ITEM_FLYTILE then
doRemoveItem(thing.uid)
elseif thing.itemid == ITEM_WATERTILE then
doTransformItem(thing.uid, WATER[1])
end
end
return true
end 

 

feito Isso Vá em Data/creaturescripts/scripts/ e vá no login.lua e coloque essa Função

 

  Mostrar conteúdo oculto

function onLogin(cid)

if getCreatureStorage(cid, FLY_STORAGE) > 0 then
local storpos = {x = getCreatureStorage(cid, storPos.x), y = getCreatureStorage(cid, storPos.y), z = getCreatureStorage(cid, storPos.z), stackpos = 0}
doCreateTile(storpos)
local thing = getThingFromPos(storpos)
if thing.itemid < 1 or isInArray(WATER, thing.itemid) then
for _, area in ipairs(getArea(storpos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid < 1 then
doCreateItem(ITEM_FLYTILE, 1, area)
elseif isInArray(WATER, getThingFromPos(area).itemid) then
doTransformItem(getThingFromPos(area).uid, ITEM_WATERTILE)
end
end
end
doRemoveConditions(cid, true)
doSetCreatureOutfit(cid, FLY_OUTFIT, -1)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You are now flying.")
doTeleportThing(cid, storpos)
return true
end
end

 

e Essa Aqui Tambem

 

  Mostrar conteúdo oculto

registerCreatureEvent(cid, "PlayerLogout")

 

Agora Crie Um Arquivo No CreatureScripts Com O Nome De logout.lua e Cole Isso Dentro

 

  Mostrar conteúdo oculto

function onLogout(cid)

if getCreatureStorage(cid, FLY_STORAGE) > 0 then
local pos = getCreaturePosition(cid)
pos.stackpos = 0
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid == ITEM_FLYTILE then
doRemoveItem(thing.uid)
elseif thing.itemid == ITEM_WATERTILE then
doTransformItem(thing.uid, WATER[1])
end
end
doCreatureSetStorage(cid, storPos.x, pos.x)
doCreatureSetStorage(cid, storPos.y, pos.y)
doCreatureSetStorage(cid, storPos.z, pos.z)
end
return true
end

 

Agora Vá no Talkactions.xml e Cole Isso Dentro

 

  Mostrar conteúdo oculto

<talkaction words="!fly;fly" case-sensitive="no" event="script" value="fly.lua"/>

 

Em Seguida Vá no Movements.xml e Cole Isso Dentro

 

  Mostrar conteúdo oculto

<movevent type="StepIn" itemid="460" event="script" value="fly.lua"/>
<movevent type="StepOut" itemid="460" event="script" value="fly.lua"/>
<movevent type="StepIn" itemid="4609-4619" event="script" value="fly.lua"/>
<movevent type="StepIn" itemid="4625" event="script" value="fly.lua"/>

 

Agora em creaturescripts.xml e Cole isso

 

  Mostrar conteúdo oculto

<event type="logout" name="PlayerLogout" event="script" value="logout.lua"/>

 

Agora o Trabalho Vai Ser Nas Sources Vá no game.cpp e Procure Por Essa Função

 

  Mostrar conteúdo oculto

bool Game::combatBlockHit(CombatType_t combatType, Creature* attacker, Creature* target,
int32_t& healthChange, bool checkDefense, bool checkArmor)

 

Substitua Por Essa

 

  Mostrar conteúdo oculto

bool Game::combatBlockHit(CombatType_t combatType, Creature* attacker, Creature* target,
int32_t& healthChange, bool checkDefense, bool checkArmor)
{
if(healthChange > 0)
return false;

const Position& targetPos = target->getPosition();
const SpectatorVec& list = getSpectators(targetPos);
if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
{
std::string value;
MagicEffect_t eff = MAGIC_EFFECT_POFF;
if(target->getStorage(g_config.getNumber(ConfigManager::FLY_STORAGE), value) && atoi(value.c_str()) > 0)
eff = MAGIC_EFFECT_NONE; 

addMagicEffect(list, targetPos, eff, target->isGhost());
return true;

}

int32_t damage = -healthChange;
BlockType_t blockType = target->blockHit(attacker, combatType, damage, checkDefense, checkArmor);

healthChange = -damage;
if(blockType == BLOCK_DEFENSE)
{
addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);
return true;
}
else if(blockType == BLOCK_ARMOR)
{
addMagicEffect(list, targetPos, MAGIC_EFFECT_BLOCKHIT);
return true;
}
else if(blockType != BLOCK_IMMUNITY)
return false;

MagicEffect_t effect = MAGIC_EFFECT_NONE;
switch(combatType)
{
case COMBAT_UNDEFINEDDAMAGE:
break;

case COMBAT_ENERGYDAMAGE:
case COMBAT_FIREDAMAGE:
case COMBAT_PHYSICALDAMAGE:
case COMBAT_ICEDAMAGE:
case COMBAT_DEATHDAMAGE:
case COMBAT_EARTHDAMAGE:
case COMBAT_HOLYDAMAGE:
{
effect = MAGIC_EFFECT_BLOCKHIT;
break;
}

default:
{
effect = MAGIC_EFFECT_POFF;
std::string value;
if(target->getStorage(g_config.getNumber(ConfigManager::FLY_STORAGE), value) && atoi(value.c_str()) > 0)
effect = MAGIC_EFFECT_NONE;

break;

}
}

addMagicEffect(list, targetPos, effect);
return true;
}

 

Ainda em game.cpp Procure por Essa Função

 

  Mostrar conteúdo oculto

bool Game::combatChangeHealth(CombatType_t combatType, Creature* attacker, Creature* target, int32_t healthChange,
MagicEffect_t hitEffect/* = MAGIC_EFFECT_UNKNOWN*/, TextColor_t hitColor/* = TEXTCOLOR_UNKNOWN*/, bool force/* = false*/)

 

e Substitua Por Essa 

 

  Mostrar conteúdo oculto

bool Game::combatChangeHealth(CombatType_t combatType, Creature* attacker, Creature* target, int32_t healthChange,
MagicEffect_t hitEffect/* = MAGIC_EFFECT_UNKNOWN*/, TextColor_t hitColor/* = TEXTCOLOR_UNKNOWN*/, bool force/* = false*/)
{
const Position& targetPos = target->getPosition();
if(healthChange > 0)
{
if(!force && target->getHealth() <= 0)
return false;

bool deny = false;
CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
{
if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_HEALTHGAIN, combatType, healthChange))
deny = true;
}

if(deny)
return false;

target->gainHealth(attacker, healthChange);
if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&
(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))
{
char buffer[20];
sprintf(buffer, "+%d", healthChange);

const SpectatorVec& list = getSpectators(targetPos);
if(combatType != COMBAT_HEALING)
addMagicEffect(list, targetPos, MAGIC_EFFECT_WRAPS_BLUE);

addAnimatedText(list, targetPos, TEXTCOLOR_GREEN, buffer);
}
}
else
{
const SpectatorVec& list = getSpectators(targetPos);
if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
{
std::string value;
MagicEffect_t eff = MAGIC_EFFECT_POFF;
if(target->getStorage(g_config.getNumber(ConfigManager::FLY_STORAGE), value) && atoi(value.c_str()) > 0)
eff = MAGIC_EFFECT_NONE;

addMagicEffect(list, targetPos, eff);
return true;

}

int32_t damage = -healthChange;
if(damage != 0)
{
if(target->hasCondition(CONDITION_MANASHIELD) && combatType != COMBAT_UNDEFINEDDAMAGE)
{
int32_t manaDamage = std::min(target->getMana(), damage);
damage = std::max((int32_t)0, damage - manaDamage);
if(manaDamage != 0)
{
bool deny = false;
CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
{
if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, combatType, manaDamage))
deny = true;
}

if(deny)
return false;

target->drainMana(attacker, combatType, manaDamage);
char buffer[20];
sprintf(buffer, "%d", manaDamage);

addMagicEffect(list, targetPos, MAGIC_EFFECT_LOSE_ENERGY);
addAnimatedText(list, targetPos, TEXTCOLOR_BLUE, buffer);
}
}

damage = std::min(target->getHealth(), damage);
if(damage > 0)
{
bool deny = false;
CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
{
if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_HEALTHLOSS, combatType, damage))
deny = true;
}

if(deny)
return false;

target->drainHealth(attacker, combatType, damage);
addCreatureHealth(list, target);

TextColor_t textColor = TEXTCOLOR_NONE;
MagicEffect_t magicEffect = MAGIC_EFFECT_NONE;
switch(combatType)
{
case COMBAT_PHYSICALDAMAGE:
{
Item* splash = NULL;
switch(target->getRace())
{
case RACE_VENOM:
textColor = TEXTCOLOR_LIGHTGREEN;
magicEffect = MAGIC_EFFECT_POISON;
splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_GREEN);
break;

case RACE_BLOOD:
textColor = TEXTCOLOR_RED;
magicEffect = MAGIC_EFFECT_DRAW_BLOOD;
splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_BLOOD);
break;

case RACE_UNDEAD:
textColor = TEXTCOLOR_GREY;
magicEffect = MAGIC_EFFECT_HIT_AREA;
break;

case RACE_FIRE:
textColor = TEXTCOLOR_ORANGE;
magicEffect = MAGIC_EFFECT_DRAW_BLOOD;
break;

case RACE_ENERGY:
textColor = TEXTCOLOR_PURPLE;
magicEffect = MAGIC_EFFECT_PURPLEENERGY;
break;

default:
break;
}

if(splash)
{
internalAddItem(NULL, target->getTile(), splash, INDEX_WHEREEVER, FLAG_NOLIMIT);
startDecay(splash);
}
break;
}

case COMBAT_ENERGYDAMAGE:
{
textColor = TEXTCOLOR_PURPLE;
magicEffect = MAGIC_EFFECT_ENERGY_DAMAGE;
break;
}

case COMBAT_EARTHDAMAGE:
{
textColor = TEXTCOLOR_LIGHTGREEN;
magicEffect = MAGIC_EFFECT_POISON_RINGS;
break;
}

case COMBAT_DROWNDAMAGE:
{
textColor = TEXTCOLOR_LIGHTBLUE;
magicEffect = MAGIC_EFFECT_LOSE_ENERGY;
break;
}

case COMBAT_FIREDAMAGE:
{
textColor = TEXTCOLOR_ORANGE;
magicEffect = MAGIC_EFFECT_HITBY_FIRE;
break;
}

case COMBAT_ICEDAMAGE:
{
textColor = TEXTCOLOR_TEAL;
magicEffect = MAGIC_EFFECT_ICEATTACK;
break;
}

case COMBAT_HOLYDAMAGE:
{
textColor = TEXTCOLOR_YELLOW;
magicEffect = MAGIC_EFFECT_HOLYDAMAGE;
break;
}

case COMBAT_DEATHDAMAGE:
{
textColor = TEXTCOLOR_DARKRED;
magicEffect = MAGIC_EFFECT_SMALLCLOUDS;
break;
}

case COMBAT_LIFEDRAIN:
{
textColor = TEXTCOLOR_RED;
magicEffect = MAGIC_EFFECT_WRAPS_RED;
break;
}

default:
break;
}

if(hitEffect != MAGIC_EFFECT_UNKNOWN)
magicEffect = hitEffect;

if(hitColor != TEXTCOLOR_UNKNOWN)
textColor = hitColor;

if(textColor < TEXTCOLOR_NONE && magicEffect < MAGIC_EFFECT_NONE)
{
char buffer[20];
sprintf(buffer, "%d", damage);

addMagicEffect(list, targetPos, magicEffect);
addAnimatedText(list, targetPos, textColor, buffer);
}
}
}
}

return true;
}

 

Agora Procure Por Essa Função

 

  Mostrar conteúdo oculto

bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange)

 

Substitua Por Essa

 

  Mostrar conteúdo oculto

bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange)

 { const Position& targetPos = target->getPosition();

 if(manaChange > 0)

 {

 bool deny = false; 

 CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);

 for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)

 {

 if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANAGAIN, COMBAT_HEALING, manaChange))

 deny = true;

 }

 if(deny)

 return false;

 target->changeMana(manaChange);

 if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&

 (g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))

 {

 char buffer[20];

 sprintf(buffer, "+%d", manaChange);

 const SpectatorVec& list = getSpectators(targetPos);

 addAnimatedText(list, targetPos, TEXTCOLOR_DARKPURPLE, buffer);

 }

 }

 else 

 { 

 const SpectatorVec& list = getSpectators(targetPos);

 if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)

 {

 std::string value;

 MagicEffect_t eff = MAGIC_EFFECT_POFF;

 if(target->getStorage(g_config.getNumber(ConfigManager::FLY_STORAGE), value) && atoi(value.c_str()) > 0)

 eff = MAGIC_EFFECT_NONE;

 

 addMagicEffect(list, targetPos, eff);

 return false;

 }

 int32_t manaLoss = std::min(target->getMana(), -manaChange);

 BlockType_t blockType = target->blockHit(attacker, COMBAT_MANADRAIN, manaLoss);

 if(blockType != BLOCK_NONE)

 {

 addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);

 return false;

 }

 if(manaLoss > 0)

 { bool deny = false;

 CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);

 for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)

 {

 if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, COMBAT_UNDEFINEDDAMAGE, manaChange))

 deny = true;

 }

 if(deny)

 return false;

 

 target->drainMana(attacker, COMBAT_MANADRAIN, manaLoss);

 char buffer[20];

 sprintf(buffer, "%d", manaLoss);

 addAnimatedText(list, targetPos, TEXTCOLOR_BLUE, buffer);

 

 }

 

 } 

 

 return true;

 

 }

 

Agora vá em configmanager.cpp e procure por essa Função

 

  Mostrar conteúdo oculto

m_confBool[ADDONS_PREMIUM] = getGlobalBool("addonsOnlyPremium", true);

 

e em baixo dela Adicione iSSO

 

  Mostrar conteúdo oculto

m_confNumber[FLY_STORAGE] = getGlobalNumber("flyStorage", 0);

 

Agora Vá em configmanager.h e Procure por Essa Função

 

  Mostrar conteúdo oculto

HOUSE_CLEAN_OLD

 

e em baixo dela Adicione Isso

 

  Mostrar conteúdo oculto

FLY_STORAGE,

 

E Pra Terminar Adicione Essa Storage no Config.lua

 

  Ocultar conteúdo

flyStorage = 65535

 

 

Creditos:

Otland.net

Darkhaos

Bem legal =): Se puder colocar um Gif ou imagens dando up e down pra deixar mas legal o post agradecemos!

Link para o comentário
Compartilhar em outros sites

Em 14/12/2016 at 23:36, zude96 disse:

Eae Galera Do Xtibia Bom Esse é o Meu Primeiro Post De  Um Conteudo Pra Vocês Bom, Como Esse Sistema Funciona ? O Player Vai Digitar o Comando !fly e em Seguinda ele Fala Fly up Pra Subir Pra Descer é o Fly Down

 

Vá em Data/lib e Crie um Arquivo Chamando 075-fly.lua e Cole Isso Dentro

 

  Mostrar conteúdo oculto

FLY_STORAGE = getConfigValue("flyStorage")

flyBlackSQM = false
nonFlyableBorder = {7576, 7577}
changeSpeed = true
flySpeed = 800
waterSpeed = 150

ITEM_FLYTILE = 460
ITEM_WATERTILE = 4625
FLY_OUTFIT = {lookType = 239, lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 0}
WATER = {4608, 4609, 4610, 4611, 4612, 4613, 4614, 4615, 4616, 4617, 4618, 4619}

RANGEX = 1
RANGEY = 1 

ret =
{
"You are now flying.",
"You are not flying anymore.",
"You cannot stop flying here.",
"You are not flying.",
"You cannot up here.",
"You cannot down here.",
"You cannot go to there."
}

storPos = {x = 1200, y = 1201, z = 1202}

function isWalkable(pos, creature, proj, pz)
if getTileThingByPos({x = pos.x, y = pos.y, z = pos.z, stackpos = 0}).itemid == 0 then return false end
if getTopCreature(pos).uid > 0 and creature then return false end
if getTileInfo(pos).protection and pz then return false, true end
local n = not proj and 3 or 2
for i = 0, 255 do
pos.stackpos = i
local tile = getTileThingByPos(pos)
if tile.itemid ~= 0 and not isCreature(tile.uid) then
if hasProperty(tile.uid, n) or hasProperty(tile.uid, 7) then
return false
end
end
end
return true
end

function getAreaToRemove(pos1, pos2)
local t = getDirectionTo(pos1, pos2)
local pos =
{
[0] =
{
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z},
{x = pos1.x, y = pos1.y + 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z}
},
[2] =
{
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x, y = pos1.y - 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z}
},
[1] =
{
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z}
},
[3] =
{
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y, z = pos1.z},
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z}
},
[7] =
{
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z},
{x = pos1.x, y = pos1.y + 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z}
},
[6] = 
{
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y, z = pos1.z},
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z},
{x = pos1.x, y = pos1.y + 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z}
},
[5] =
{
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x - 1, y = pos1.y, z = pos1.z},
{x = pos1.x - 1, y = pos1.y + 1, z = pos1.z},
{x = pos1.x, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z}
},
[4] =
{
{x = pos1.x - 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y - 1, z = pos1.z},
{x = pos1.x + 1, y = pos1.y, z = pos1.z},
{x = pos1.x + 1, y = pos1.y + 1, z = pos1.z}
}
}
return pos[t]
end

function doCreateTile(pos)
doAreaCombatHealth(0, 0, pos, 0, 0, 0, 255)
end

 

Agora Vá em Data/Talkactions e Crie Um Arquivo Chamado fly.lua e Cole Isso Dentro

 

  Mostrar conteúdo oculto

function onSay(cid, words, param)

local pos = getCreaturePosition(cid)
pos.stackpos = 0

if(words == "!fly") then
if getCreatureStorage(cid, FLY_STORAGE) > 0 then
if not isWalkable(getCreaturePosition(cid)) or getThingFromPos(pos).itemid == ITEM_FLYTILE or getThingFromPos(pos).itemid == ITEM_WATERTILE then
doPlayerSendCancel(cid, ret[3])
return true
end
doChangeSpeed(cid, -getCreatureSpeed(cid) + getCreatureBaseSpeed(cid))
doCreatureSetStorage(cid, FLY_STORAGE, 0)
doRemoveCondition(cid, CONDITION_OUTFIT)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, ret[2])
return true
else
doCreatureSetStorage(cid, FLY_STORAGE, 1)
doRemoveConditions(cid, true)
doSetCreatureOutfit(cid, FLY_OUTFIT, -1)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, ret[1])
if changeSpeed then
doChangeSpeed(cid, flySpeed)
end
return true
end
elseif(words == "fly") then
if param == "up" then

pos.z = pos.z - 1
doCreateTile(pos)
if getCreatureStorage(cid, FLY_STORAGE) < 1 then
doPlayerSendCancel(cid, ret[4])
return true
end
if(getCreaturePosition(cid).z == 0) or (getThingFromPos(pos).itemid ~= ITEM_FLYTILE and getThingFromPos(pos).itemid > 0) or (getTileInfo(pos).house) then
doPlayerSendCancel(cid, ret[5])
return true
end
local tpos = pos
tpos.stackpos = 253
if isCreature(getThingFromPos(tpos).uid) then
doPlayerSendCancel(cid, ret[5])
return true
end

local toCreate = {}
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid < 1 then
table.insert(toCreate, area)
end
end
if getThingFromPos(pos).itemid < 1 then
for _, create in ipairs(toCreate) do
create.stackpos = 0
doCreateItem(ITEM_FLYTILE, 1, create)
end
doTeleportThing(cid, pos)
if changeSpeed then
doChangeSpeed(cid, flySpeed)
end
pos.z = pos.z + 1
doSendMagicEffect(pos, CONST_ME_BLOCKHIT)
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid == ITEM_FLYTILE then
doRemoveItem(thing.uid)
elseif thing.itemid == ITEM_WATERTILE then
doTransformItem(thing.uid, WATER[1])
end
end
else
doPlayerSendCancel(cid, ret[7])
end

elseif param == "down" then

pos.z = pos.z + 1
doCreateTile(pos)
if getCreatureStorage(cid, FLY_STORAGE) < 1 then
doPlayerSendCancel(cid, ret[4])
return true
end
if getCreaturePosition(cid).z == 14 then
doPlayerSendCancel(cid, ret[6])
return true
end
if(getTileInfo(pos).house) then
doPlayerSendCancel(cid, ret[6])
return true
end
local cpos = getCreaturePosition(cid)
cpos.stackpos = 0
if getThingFromPos(cpos).itemid ~= ITEM_FLYTILE then
doPlayerSendCancel(cid, ret[6])
return true
end
local tpos = pos
tpos.stackpos = 253
if isCreature(getThingFromPos(tpos).uid) then
doPlayerSendCancel(cid, ret[6])
return true
end

local toCreate = {}
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
doCreateTile(area) 
local thing = getThingFromPos(area)
if(thing.itemid < 1 or isInArray(WATER, thing.itemid)) then
table.insert(toCreate, area) 
end
end

local x = false
if isWalkable(pos) or getThingFromPos(pos).itemid < 1 or isInArray(WATER, getThingFromPos(pos).itemid) then
for _, create in ipairs(toCreate) do
if isInArray(WATER, getThingFromPos(create).itemid) then
doTransformItem(getThingFromPos(create).uid, ITEM_WATERTILE)
x = (create.z == pos.z and true or false)
else
doCreateItem(ITEM_FLYTILE, 1, create)
end
end
doTeleportThing(cid, pos)
doSendMagicEffect(pos, (x and CONST_ME_WATERSPLASH or getThingFromPos(pos).itemid == ITEM_WATERTILE and CONST_ME_WATERSPLASH or CONST_ME_NONE))
if changeSpeed then
doChangeSpeed(cid, (x and (-getCreatureSpeed(cid) + waterSpeed + getCreatureBaseSpeed(cid)) or (-getCreatureSpeed(cid) + flySpeed + getCreatureBaseSpeed(cid))))
end
pos.z = pos.z - 1
doSendMagicEffect(pos, CONST_ME_BLOCKHIT)
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
local thing = getThingFromPos(area)
if thing.itemid == ITEM_FLYTILE then
doRemoveItem(thing.uid)
end
end
else
doPlayerSendCancel(cid, ret[7])
end
end
end
return true
end

 

Agora Vá em Data/Movements/Scripts e Crie um Arquivo Chamado fly.lua e Cole Isso Dentro

 

  Mostrar conteúdo oculto

function onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)


if isInArray({ITEM_FLYTILE, ITEM_WATERTILE}, item.itemid) then

if not isPlayer(cid) then
doTeleportThing(cid, fromPosition)
return true
end
if getCreatureStorage(cid, FLY_STORAGE) < 1 then
doPlayerSendCancel(cid, ret[4])
doTeleportThing(cid, fromPosition)
return true
end 

local toPos = toPosition
toPos.stackpos = 0
if not flyBlackSQM then
toPos.z = 7
doCreateTile(toPos)
if getThingFromPos(toPos).itemid < 1 or getThingFromPos(toPos).itemid == ITEM_FLYTILE then
doTeleportThing(cid, fromPosition)
return true
end
toPos.z = toPosition.z
end

if(getTileInfo(toPos).house) then
doTeleportThing(cid, fromPosition)
return true
end

if nonFlyableBorder and type(nonFlyableBorder) == "table" then
for i = toPos.z, 14 do
toPos.z = i
toPos.stackpos = 1
doCreateTile(toPos)
if isInArray(nonFlyableBorder, getThingFromPos(toPos).itemid) then
doTeleportThing(cid, fromPosition)
return true
end
end
toPos.z = getCreaturePosition(cid).z
toPos.stackpos = 0
end
for _, area in ipairs(getArea(toPos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid < 1 or thing.itemid == ITEM_FLYTILE then
doCreateItem(ITEM_FLYTILE, 1, area)
elseif thing.itemid == ITEM_WATERTILE or isInArray(WATER, thing.itemid) then
doTransformItem(thing.uid, ITEM_WATERTILE)
end
end
end
return true
end

function onStepOut(cid, item, position, lastPosition, fromPosition, toPosition, actor)

local area = getAreaToRemove(fromPosition, toPosition)
for _, arear in ipairs(area) do
doCreateTile(arear)
local thing = getThingFromPos(arear)
if thing.itemid == ITEM_FLYTILE then
doRemoveItem(thing.uid)
elseif thing.itemid == ITEM_WATERTILE then
doTransformItem(thing.uid, WATER[1])
end
end
return true
end 

 

feito Isso Vá em Data/creaturescripts/scripts/ e vá no login.lua e coloque essa Função

 

  Mostrar conteúdo oculto

function onLogin(cid)

if getCreatureStorage(cid, FLY_STORAGE) > 0 then
local storpos = {x = getCreatureStorage(cid, storPos.x), y = getCreatureStorage(cid, storPos.y), z = getCreatureStorage(cid, storPos.z), stackpos = 0}
doCreateTile(storpos)
local thing = getThingFromPos(storpos)
if thing.itemid < 1 or isInArray(WATER, thing.itemid) then
for _, area in ipairs(getArea(storpos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid < 1 then
doCreateItem(ITEM_FLYTILE, 1, area)
elseif isInArray(WATER, getThingFromPos(area).itemid) then
doTransformItem(getThingFromPos(area).uid, ITEM_WATERTILE)
end
end
end
doRemoveConditions(cid, true)
doSetCreatureOutfit(cid, FLY_OUTFIT, -1)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE, "You are now flying.")
doTeleportThing(cid, storpos)
return true
end
end

 

e Essa Aqui Tambem

 

  Mostrar conteúdo oculto

registerCreatureEvent(cid, "PlayerLogout")

 

Agora Crie Um Arquivo No CreatureScripts Com O Nome De logout.lua e Cole Isso Dentro

 

  Mostrar conteúdo oculto

function onLogout(cid)

if getCreatureStorage(cid, FLY_STORAGE) > 0 then
local pos = getCreaturePosition(cid)
pos.stackpos = 0
for _, area in ipairs(getArea(pos, RANGEX, RANGEY)) do
doCreateTile(area)
local thing = getThingFromPos(area)
if thing.itemid == ITEM_FLYTILE then
doRemoveItem(thing.uid)
elseif thing.itemid == ITEM_WATERTILE then
doTransformItem(thing.uid, WATER[1])
end
end
doCreatureSetStorage(cid, storPos.x, pos.x)
doCreatureSetStorage(cid, storPos.y, pos.y)
doCreatureSetStorage(cid, storPos.z, pos.z)
end
return true
end

 

Agora Vá no Talkactions.xml e Cole Isso Dentro

 

  Mostrar conteúdo oculto

<talkaction words="!fly;fly" case-sensitive="no" event="script" value="fly.lua"/>

 

Em Seguida Vá no Movements.xml e Cole Isso Dentro

 

  Mostrar conteúdo oculto

<movevent type="StepIn" itemid="460" event="script" value="fly.lua"/>
<movevent type="StepOut" itemid="460" event="script" value="fly.lua"/>
<movevent type="StepIn" itemid="4609-4619" event="script" value="fly.lua"/>
<movevent type="StepIn" itemid="4625" event="script" value="fly.lua"/>

 

Agora em creaturescripts.xml e Cole isso

 

  Mostrar conteúdo oculto

<event type="logout" name="PlayerLogout" event="script" value="logout.lua"/>

 

Agora o Trabalho Vai Ser Nas Sources Vá no game.cpp e Procure Por Essa Função

 

  Mostrar conteúdo oculto

bool Game::combatBlockHit(CombatType_t combatType, Creature* attacker, Creature* target,
int32_t& healthChange, bool checkDefense, bool checkArmor)

 

Substitua Por Essa

 

  Mostrar conteúdo oculto

bool Game::combatBlockHit(CombatType_t combatType, Creature* attacker, Creature* target,
int32_t& healthChange, bool checkDefense, bool checkArmor)
{
if(healthChange > 0)
return false;

const Position& targetPos = target->getPosition();
const SpectatorVec& list = getSpectators(targetPos);
if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
{
std::string value;
MagicEffect_t eff = MAGIC_EFFECT_POFF;
if(target->getStorage(g_config.getNumber(ConfigManager::FLY_STORAGE), value) && atoi(value.c_str()) > 0)
eff = MAGIC_EFFECT_NONE; 

addMagicEffect(list, targetPos, eff, target->isGhost());
return true;

}

int32_t damage = -healthChange;
BlockType_t blockType = target->blockHit(attacker, combatType, damage, checkDefense, checkArmor);

healthChange = -damage;
if(blockType == BLOCK_DEFENSE)
{
addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);
return true;
}
else if(blockType == BLOCK_ARMOR)
{
addMagicEffect(list, targetPos, MAGIC_EFFECT_BLOCKHIT);
return true;
}
else if(blockType != BLOCK_IMMUNITY)
return false;

MagicEffect_t effect = MAGIC_EFFECT_NONE;
switch(combatType)
{
case COMBAT_UNDEFINEDDAMAGE:
break;

case COMBAT_ENERGYDAMAGE:
case COMBAT_FIREDAMAGE:
case COMBAT_PHYSICALDAMAGE:
case COMBAT_ICEDAMAGE:
case COMBAT_DEATHDAMAGE:
case COMBAT_EARTHDAMAGE:
case COMBAT_HOLYDAMAGE:
{
effect = MAGIC_EFFECT_BLOCKHIT;
break;
}

default:
{
effect = MAGIC_EFFECT_POFF;
std::string value;
if(target->getStorage(g_config.getNumber(ConfigManager::FLY_STORAGE), value) && atoi(value.c_str()) > 0)
effect = MAGIC_EFFECT_NONE;

break;

}
}

addMagicEffect(list, targetPos, effect);
return true;
}

 

Ainda em game.cpp Procure por Essa Função

 

  Mostrar conteúdo oculto

bool Game::combatChangeHealth(CombatType_t combatType, Creature* attacker, Creature* target, int32_t healthChange,
MagicEffect_t hitEffect/* = MAGIC_EFFECT_UNKNOWN*/, TextColor_t hitColor/* = TEXTCOLOR_UNKNOWN*/, bool force/* = false*/)

 

e Substitua Por Essa 

 

  Mostrar conteúdo oculto

bool Game::combatChangeHealth(CombatType_t combatType, Creature* attacker, Creature* target, int32_t healthChange,
MagicEffect_t hitEffect/* = MAGIC_EFFECT_UNKNOWN*/, TextColor_t hitColor/* = TEXTCOLOR_UNKNOWN*/, bool force/* = false*/)
{
const Position& targetPos = target->getPosition();
if(healthChange > 0)
{
if(!force && target->getHealth() <= 0)
return false;

bool deny = false;
CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
{
if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_HEALTHGAIN, combatType, healthChange))
deny = true;
}

if(deny)
return false;

target->gainHealth(attacker, healthChange);
if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&
(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))
{
char buffer[20];
sprintf(buffer, "+%d", healthChange);

const SpectatorVec& list = getSpectators(targetPos);
if(combatType != COMBAT_HEALING)
addMagicEffect(list, targetPos, MAGIC_EFFECT_WRAPS_BLUE);

addAnimatedText(list, targetPos, TEXTCOLOR_GREEN, buffer);
}
}
else
{
const SpectatorVec& list = getSpectators(targetPos);
if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)
{
std::string value;
MagicEffect_t eff = MAGIC_EFFECT_POFF;
if(target->getStorage(g_config.getNumber(ConfigManager::FLY_STORAGE), value) && atoi(value.c_str()) > 0)
eff = MAGIC_EFFECT_NONE;

addMagicEffect(list, targetPos, eff);
return true;

}

int32_t damage = -healthChange;
if(damage != 0)
{
if(target->hasCondition(CONDITION_MANASHIELD) && combatType != COMBAT_UNDEFINEDDAMAGE)
{
int32_t manaDamage = std::min(target->getMana(), damage);
damage = std::max((int32_t)0, damage - manaDamage);
if(manaDamage != 0)
{
bool deny = false;
CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
{
if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, combatType, manaDamage))
deny = true;
}

if(deny)
return false;

target->drainMana(attacker, combatType, manaDamage);
char buffer[20];
sprintf(buffer, "%d", manaDamage);

addMagicEffect(list, targetPos, MAGIC_EFFECT_LOSE_ENERGY);
addAnimatedText(list, targetPos, TEXTCOLOR_BLUE, buffer);
}
}

damage = std::min(target->getHealth(), damage);
if(damage > 0)
{
bool deny = false;
CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);
for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)
{
if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_HEALTHLOSS, combatType, damage))
deny = true;
}

if(deny)
return false;

target->drainHealth(attacker, combatType, damage);
addCreatureHealth(list, target);

TextColor_t textColor = TEXTCOLOR_NONE;
MagicEffect_t magicEffect = MAGIC_EFFECT_NONE;
switch(combatType)
{
case COMBAT_PHYSICALDAMAGE:
{
Item* splash = NULL;
switch(target->getRace())
{
case RACE_VENOM:
textColor = TEXTCOLOR_LIGHTGREEN;
magicEffect = MAGIC_EFFECT_POISON;
splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_GREEN);
break;

case RACE_BLOOD:
textColor = TEXTCOLOR_RED;
magicEffect = MAGIC_EFFECT_DRAW_BLOOD;
splash = Item::CreateItem(ITEM_SMALLSPLASH, FLUID_BLOOD);
break;

case RACE_UNDEAD:
textColor = TEXTCOLOR_GREY;
magicEffect = MAGIC_EFFECT_HIT_AREA;
break;

case RACE_FIRE:
textColor = TEXTCOLOR_ORANGE;
magicEffect = MAGIC_EFFECT_DRAW_BLOOD;
break;

case RACE_ENERGY:
textColor = TEXTCOLOR_PURPLE;
magicEffect = MAGIC_EFFECT_PURPLEENERGY;
break;

default:
break;
}

if(splash)
{
internalAddItem(NULL, target->getTile(), splash, INDEX_WHEREEVER, FLAG_NOLIMIT);
startDecay(splash);
}
break;
}

case COMBAT_ENERGYDAMAGE:
{
textColor = TEXTCOLOR_PURPLE;
magicEffect = MAGIC_EFFECT_ENERGY_DAMAGE;
break;
}

case COMBAT_EARTHDAMAGE:
{
textColor = TEXTCOLOR_LIGHTGREEN;
magicEffect = MAGIC_EFFECT_POISON_RINGS;
break;
}

case COMBAT_DROWNDAMAGE:
{
textColor = TEXTCOLOR_LIGHTBLUE;
magicEffect = MAGIC_EFFECT_LOSE_ENERGY;
break;
}

case COMBAT_FIREDAMAGE:
{
textColor = TEXTCOLOR_ORANGE;
magicEffect = MAGIC_EFFECT_HITBY_FIRE;
break;
}

case COMBAT_ICEDAMAGE:
{
textColor = TEXTCOLOR_TEAL;
magicEffect = MAGIC_EFFECT_ICEATTACK;
break;
}

case COMBAT_HOLYDAMAGE:
{
textColor = TEXTCOLOR_YELLOW;
magicEffect = MAGIC_EFFECT_HOLYDAMAGE;
break;
}

case COMBAT_DEATHDAMAGE:
{
textColor = TEXTCOLOR_DARKRED;
magicEffect = MAGIC_EFFECT_SMALLCLOUDS;
break;
}

case COMBAT_LIFEDRAIN:
{
textColor = TEXTCOLOR_RED;
magicEffect = MAGIC_EFFECT_WRAPS_RED;
break;
}

default:
break;
}

if(hitEffect != MAGIC_EFFECT_UNKNOWN)
magicEffect = hitEffect;

if(hitColor != TEXTCOLOR_UNKNOWN)
textColor = hitColor;

if(textColor < TEXTCOLOR_NONE && magicEffect < MAGIC_EFFECT_NONE)
{
char buffer[20];
sprintf(buffer, "%d", damage);

addMagicEffect(list, targetPos, magicEffect);
addAnimatedText(list, targetPos, textColor, buffer);
}
}
}
}

return true;
}

 

Agora Procure Por Essa Função

 

  Mostrar conteúdo oculto

bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange)

 

Substitua Por Essa

 

  Mostrar conteúdo oculto

bool Game::combatChangeMana(Creature* attacker, Creature* target, int32_t manaChange)

 { const Position& targetPos = target->getPosition();

 if(manaChange > 0)

 {

 bool deny = false; 

 CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);

 for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)

 {

 if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANAGAIN, COMBAT_HEALING, manaChange))

 deny = true;

 }

 if(deny)

 return false;

 target->changeMana(manaChange);

 if(g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE) && !target->isGhost() &&

 (g_config.getBool(ConfigManager::SHOW_HEALING_DAMAGE_MONSTER) || !target->getMonster()))

 {

 char buffer[20];

 sprintf(buffer, "+%d", manaChange);

 const SpectatorVec& list = getSpectators(targetPos);

 addAnimatedText(list, targetPos, TEXTCOLOR_DARKPURPLE, buffer);

 }

 }

 else 

 { 

 const SpectatorVec& list = getSpectators(targetPos);

 if(!target->isAttackable() || Combat::canDoCombat(attacker, target) != RET_NOERROR)

 {

 std::string value;

 MagicEffect_t eff = MAGIC_EFFECT_POFF;

 if(target->getStorage(g_config.getNumber(ConfigManager::FLY_STORAGE), value) && atoi(value.c_str()) > 0)

 eff = MAGIC_EFFECT_NONE;

 

 addMagicEffect(list, targetPos, eff);

 return false;

 }

 int32_t manaLoss = std::min(target->getMana(), -manaChange);

 BlockType_t blockType = target->blockHit(attacker, COMBAT_MANADRAIN, manaLoss);

 if(blockType != BLOCK_NONE)

 {

 addMagicEffect(list, targetPos, MAGIC_EFFECT_POFF);

 return false;

 }

 if(manaLoss > 0)

 { bool deny = false;

 CreatureEventList statsChangeEvents = target->getCreatureEvents(CREATURE_EVENT_STATSCHANGE);

 for(CreatureEventList::iterator it = statsChangeEvents.begin(); it != statsChangeEvents.end(); ++it)

 {

 if(!(*it)->executeStatsChange(target, attacker, STATSCHANGE_MANALOSS, COMBAT_UNDEFINEDDAMAGE, manaChange))

 deny = true;

 }

 if(deny)

 return false;

 

 target->drainMana(attacker, COMBAT_MANADRAIN, manaLoss);

 char buffer[20];

 sprintf(buffer, "%d", manaLoss);

 addAnimatedText(list, targetPos, TEXTCOLOR_BLUE, buffer);

 

 }

 

 } 

 

 return true;

 

 }

 

Agora vá em configmanager.cpp e procure por essa Função

 

  Mostrar conteúdo oculto

m_confBool[ADDONS_PREMIUM] = getGlobalBool("addonsOnlyPremium", true);

 

e em baixo dela Adicione iSSO

 

  Mostrar conteúdo oculto

m_confNumber[FLY_STORAGE] = getGlobalNumber("flyStorage", 0);

 

Agora Vá em configmanager.h e Procure por Essa Função

 

  Mostrar conteúdo oculto

HOUSE_CLEAN_OLD

 

e em baixo dela Adicione Isso

 

  Mostrar conteúdo oculto

FLY_STORAGE,

 

E Pra Terminar Adicione Essa Storage no Config.lua

 

  Mostrar conteúdo oculto

flyStorage = 65535

 

Como esse Foi Meu Primeiro Post Então Não Tenho Muita Experiencia Aqui, Não Consegui por o Gif, Mais Vou Por Link Das Imagens Do Fly up e Down

 

 

Pra Configurar a Outfit Que Fica após vc digitar o Comando !fly, Vá em Data/lib 075-fly.lua e altere Nessa Linha

 

  Ocultar conteúdo

FLY_OUTFIT = {lookType = 239, lookHead = 0, lookBody = 0, lookLegs = 0, lookFeet = 0, lookTypeEx = 0, lookAddons = 0}

 

Creditos:

Otland.net

Darkhaos

 

 

Me explica 1  coisa q não entendi todos personagems vão tar com o msm newtype no fly?

 

Link para o comentário
Compartilhar em outros sites

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...