• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

push with mana rune

LoOoZa

Member
Joined
Sep 18, 2017
Messages
68
Reaction score
6
hi guys

if pushCreatureDelay = 1 * 300 , cant push player with mana rune.

if pushCreatureDelay = 0 * 300 , can push player with mana rune.

i want pushCreatureDelay = 1 * 300 , can push with mana.


my config.lua
Code:
-- The OTX Server Config

    -- Owner Data
    ownerName = ""
    ownerEmail = ""
    url = ""
    location = ""

    -- Messages
    motd = "Welcome to the OTX Server!"
    serverName = "Babek-Ots"
    loginMessage = "Welcome to Babek-Ots!"
    displayGamemastersWithOnlineCommand = false

    -- MySql
    sqlType = "mysql"
    sqlHost = "127.0.0.1"
    sqlPort = 3306
    sqlUser = "welcome"
    sqlPass = "das56wda7dasdw"
    sqlDatabase = "welcome"
    sqlFile = "schemas/otxserver.s3db"
    sqlKeepAlive = 0
    mysqlReadTimeout = 10
    mysqlWriteTimeout = 10
    mysqlReconnectionAttempts = 5
    encryptionType = "sha1" --// encryptionType can be (plain, md5, sha1, sha256 or sha512).

    -- World / Ip / Port
    worldId = 0
    ip = "127.0.0.1"
    worldType = "3"
    bindOnlyGlobalAddress = false
    loginPort = 7171
    gamePort = "7172"
    statusPort = 7171
    loginOnlyWithLoginServer = false

    -- Account manager
    accountManager = true
    namelockManager = true
    newPlayerChooseVoc = true
    newPlayerSpawnPosX = 1001
    newPlayerSpawnPosY = 1030
    newPlayerSpawnPosZ = 7
    newPlayerTownId = 1
    newPlayerLevel = 8
    newPlayerMagicLevel = 0
    generateAccountNumber = false
    generateAccountSalt = true

    -- Limits on frags / Time
    fragsLimit = 24 * 60 * 60
    fragsSecondLimit = 7 * 24 * 60 * 60
    fragsThirdLimit = 30 * 24 * 60 * 60

    -- Red Skull Config
    fragsToRedSkull = 3
    fragsSecondToRedSkull = 5
    fragsThirdToRedSkull = 10
    redSkullLength = 3 * 24 * 60 * 60

    -- Black Skull Config
    fragsToBlackSkull = 6
    fragsSecondToBlackSkull = 10
    fragsThirdToBlackSkull = 20
    blackSkulledDeathHealth = 40
    blackSkulledDeathMana = 0
    blackSkullLength = 6 * 24 * 60 * 60
    useBlackSkull = true

    -- Banishment Config
    -- killsBanLength works only if useBlackSkull option is disabled.
    notationsToBan = 3
    warningsToFinalBan = 4
    warningsToDeletion = 5
    banLength = 7 * 24 * 60 * 60
    killsBanLength = 7 * 24 * 60 * 60
    finalBanLength = 30 * 24 * 60 * 60
    ipBanLength = 1 * 24 * 60 * 60
    fragsToBanishment = 7
    fragsSecondToBanishment = 21
    fragsThirdToBanishment = 41

    -- Battle
    -- NOTE: showHealth/ManaChangeForMonsters inherites from showHealth/ManaChange.
    protectionLevel = 1
    pvpTileIgnoreLevelAndVocationProtection = true
    pzLocked = 60 * 1000
    huntingDuration = 0
    criticalHitMultiplier = 0
    displayCriticalHitNotify = true
    removeWeaponAmmunition = true
    removeWeaponCharges = true
    removeRuneCharges = true
    whiteSkullTime = 1 * 60 * 1000
    advancedFragList = true
    useFragHandler = true
    noDamageToSameLookfeet = false
    showHealthChange = true
    showManaChange = true
    showHealthChangeForMonsters = true
    showManaChangeForMonsters = true
    fieldOwnershipDuration = 5 * 1000
    stopAttackingAtExit = true
    loginProtectionPeriod = 10 * 1000
    deathLostPercent = 10
    stairhopDelay = 2 * 1000
    pushCreatureDelay = 1 * 300
    deathContainerId = 1987
    gainExperienceColor = 215
    addManaSpentInPvPZone = true
    recoverManaAfterDeathInPvPZone = true
    squareColor = 0
    broadcastBanishments = false
    maxViolationCommentSize = 60
    violationNameReportActionType = 2

    -- RSA
    -- NOTE: These should not be changed unless you know what your doing!
    -- Prime1 - known as p; Prime2 - known as q; Public - known as e;
    -- Modulus - known as n; Private - known as d.
    -- How make custom client with custom RSA Key: http://vapus.net/customclient
    rsaPrime1 = "14299623962416399520070177382898895550795403345466153217470516082934737582776038882967213386204600674145392845853859217990626450972452084065728686565928113"
    rsaPrime2 = "7630979195970404721891201847792002125535401292779123937207447574596692788513647179235335529307251350570728407373705564708871762033017096809910315212884101"
    rsaPublic = "65537"
    rsaModulus = "109120132967399429278860960508995541528237502902798129123468757937266291492576446330739696001110603907230888610072655818825358503429057592827629436413108566029093628212635953836686562675849720620786279431090218017681061521755056710823876476444260558147179707119674283982419152118103759076030616683978566631413"
    rsaPrivate = "46730330223584118622160180015036832148732986808519344675210555262940258739805766860224610646919605860206328024326703361630109888417839241959507572247284807035235569619173792292786907845791904955103601652822519121908367187885509270025388641700821735345222087940578381210879116823013776808975766851829020659073"

    -- OTX Server Extras Features
        -- Battle
        optionalWarAttackableAlly = true
        fistBaseAttack = 7
        criticalHitChance = 7
        noDamageToGuildMates = false
            -- if true then no damage, if false then damage
        noDamageToPartyMembers = false
            -- if true then no damage, if false then damage

        -- Rook System
        rookLevelTo = 5
        rookLevelToLeaveRook = 8
        rookTownId = 1
        useRookSystem = true

        -- Paralyze delay
        paralyzeDelay = 1500

        -- GUI
        premiumDaysToAddByGui = 10

        -- Depot and Miscellaneous
        -- set playerFollowExhaust to 2000 if someone causes lags and kicks by following unreachable creatures too often
        useCapacity = false
        defaultDepotSize = 500
        defaultDepotSizePremium = 1000
        enableProtectionQuestForGM = true
        cleanItemsInMap = false
        playerFollowExhaust = 2000

        -- 8.7x + config
        monsterSpawnWalkback = true
        allowBlockSpawn = true
        classicEquipmentSlots = true

        -- Summons and monsters
        NoShareExpSummonMonster = false

        -- Others
        enableLootBagDisplay = false
        highscoreDisplayPlayers = 10
        updateHighscoresAfterMinutes = 60
        attackImmediatelyAfterLoggingIn = false
        exhaustionNPC = true
        exhaustionInSecondsNPC = 0.5

        manualVersionConfig = true
        versionMin = 810
        versionMax = 810
        versionMsg = "Only clients with protocol 8.10 allowed!"

    -- Connection config
    loginTries = 20
    retryTimeout = 5 * 1000
    loginTimeout = 60 * 1000
    maxPlayers = 1000
    displayOnOrOffAtCharlist = false
    onePlayerOnlinePerAccount = true
    allowClones = 0
    statusTimeout = 1000
    replaceKickOnLogin = false
    forceSlowConnectionsToDisconnect = false
    premiumPlayerSkipWaitList = true
    packetsPerSecond = 50
    loginProtectionTime = 10

    -- Deathlist
    deathListEnabled = true
    deathListRequiredTime = 1 * 60 * 1000
    deathAssistCount = 20
    maxDeathRecords = 5
    multipleNames = false

    -- Guilds
    -- NOTE: externalGuildWarsManagement supports Automatic Account Creator(webpage or whatever you want)
    externalGuildWarsManagement = false
    ingameGuildManagement = true
    levelToFormGuild = 20
    premiumDaysToFormGuild = 0
    guildNameMinLength = 4
    guildNameMaxLength = 20

    -- Houses
    buyableAndSellableHouses = true
    houseNeedPremium = false
    bedsRequirePremium = false
    levelToBuyHouse = 400
    housesPerAccount = 1
    houseRentAsPrice = false
    housePriceAsRent = false
    housePriceEachSquare = 1000
    houseRentPeriod = "weekly"
    houseCleanOld = 8 * 24 * 60 * 60
    guildHalls = true
    houseSkipInitialRent = true
    houseProtection = true

    -- Item usage
    timeBetweenActions = 200
    timeBetweenExActions = 1000
    timeBetweenCustomActions = 500
    checkCorpseOwner = true
    hotkeyAimbotEnabled = true
    maximumDoorLevel = 999
    tradeLimit = 100
    canOnlyRopePlayers = false

    -- Map
    -- NOTE: storeTrash costs more memory, but will perform alot faster cleaning.
    -- houseDataStorage usage may be found at how-use-internal-functions.log
    mapAuthor = "Komic"
    randomizeTiles = true
    houseDataStorage = "binary-tilebased"
    storeTrash = true
    cleanProtectedZones = true
    mapName = "forgotten.otbm"
        -- For Windows(compiled with MSVC) and Linux use:
        -- OTX Server use default GroundCache
        -- GroundCache mode save memory: __GROUND_CACHE__
            -- forgotten map on normal mode use memory: 361,512 KB
            -- forgotten map with groundCache mode use memory: 334,124 KB

    -- Mailbox
    mailMaxAttempts = 5
    mailBlockPeriod = 30 * 60 * 1000
    mailAttemptsFadeTime = 5 * 60 * 1000
    mailboxDisabledTowns = ""
        -- Example disable rook depot (temple) "4"
        -- mailboxDisabledTowns = "4"

    -- Startup
    -- For Linux use "-1" is default
    -- daemonize works only on *nix, same as niceLevel
    daemonize = false
    defaultPriority = "higher"
    niceLevel = 5
    serviceThreads = 1
    coresUsed = "-1" -- ("0, 1, 2, 3") -- For QuadCore ONLY Windows
    startupDatabaseOptimization = true
    removePremiumOnInit = true
    confirmOutdatedVersion = false
    skipItemsVersionCheck = true

    -- Muted buffer
    maxMessageBuffer = 4

    -- Miscellaneous
    dataDirectory = "data/"
    logsDirectory = "data/logs/"
    disableOutfitsForPrivilegedPlayers = false
    bankSystem = true
    spellNameInsteadOfWords = false
    emoteSpells = false
    unifiedSpells = true
    promptExceptionTracerErrorBox = true
    storePlayerDirection = false
    savePlayerData = true
    monsterLootMessage = 3
    monsterLootMessageType = 22
    separateViplistPerCharacter = false
    vipListDefaultLimit = 20
    vipListDefaultPremiumLimit = 100

    -- Outfits
    allowChangeOutfit = true
    allowChangeColors = true
    allowChangeAddons = true
    addonsOnlyPremium = false

    -- Ghost mode
    ghostModeInvisibleEffect = false
    ghostModeSpellEffects = true

    -- Limits
    idleWarningTime = 14 * 60 * 1000
    idleKickTime = 15 * 60 * 1000
    expireReportsAfterReads = 1
    playerQueryDeepness = -1
    protectionTileLimit = 10
    houseTileLimit = 10
    tileLimit = 7

    -- Premium-related
    freePremium = true
    premiumForPromotion = false
    updatePremiumStateAtStartup = true

    -- Blessings
    blessings = true
    blessingOnlyPremium = true
    blessingReductionBase = 30
    blessingReductionDecrement = 5
    eachBlessReduction = 8
    useFairfightReduction = true
    pvpBlessingThreshold = 40
    fairFightTimeRange = 60

    -- Rates
    experienceStages = false
    rateExperience = 5.0
    rateExperienceFromPlayers = 5
    levelToOfflineTraining = 8
    rateSkill = 1.0
    rateSkillOffline = 0.5
    rateMagic = 1.0
    rateMagicOffline = 0.5
    rateLoot = 2.0
    rateSpawnMin = 1
    rateSpawnMax = 1
    formulaLevel = 5.0
    formulaMagic = 1.0
        -- Monster rates
        rateMonsterHealth = 1.0
        rateMonsterMana = 1.0
        rateMonsterAttack = 1.0
        rateMonsterDefense = 1.0

    -- Experience from players
    minLevelThresholdForKilledPlayer = 0.9
    maxLevelThresholdForKilledPlayer = 1.1

    -- Stamina System
    rateStaminaLoss = 0
    rateStaminaGain = 0
    rateStaminaThresholdGain = 12
    staminaRatingLimitTop = 40 * 60
    staminaRatingLimitBottom = 14 * 60
    staminaLootLimit = 14 * 60
    rateStaminaAboveNormal = 1.5
    rateStaminaUnderNormal = 0.5
    staminaThresholdOnlyPremium = true

    -- Party System
    experienceShareRadiusX = 30
    experienceShareRadiusY = 30
    experienceShareRadiusZ = 1
    experienceShareLevelDifference = 2 / 3
    extraPartyExperienceLimit = 20
    extraPartyExperiencePercent = 5
    experienceShareActivity = 2 * 60 * 1000

    -- Global save
    globalSaveEnabled = false
    globalSaveHour = 8
    globalSaveMinute = 0
    shutdownAtGlobalSave = true
    cleanMapAtGlobalSave = false

    -- Spawns
    minRateSpawn = 1
    maxRateSpawn = 3
    deSpawnRange = 2
    deSpawnRadius = 50

    -- Summons
    maxPlayerSummons = 1
    teleportAllSummons = false
    teleportPlayerSummons = false

    -- Logs
    disableLuaErrors = false
    adminLogs = true
    displayPlayersLogging = true
    prefixChannelLogs = ""
    runFile = "server/run.log"
    outputLog = "server/out.log"
    truncateLogOnStartup = false
    logPlayersStatements = false

    -- Manager
    -- NOTE: managerPassword left blank disables manager.
    managerPort = 7171
    managerLogs = true
    managerPassword = ""
    managerLocalhostOnly = true
    managerConnectionsLimit = 1

    -- Admin
    -- NOTE: adminPassword left blank disables manager.
    -- Set to anything if you set adminRequireLogin to false.
    -- adminEncryption available options: rsa1024xtea;
    -- remember to set correct data!
    adminPort = 7171
    adminPassword = ""
    adminLocalhostOnly = true
    adminConnectionsLimit = 1
    adminRequireLogin = true
    adminEncryption = ""
    adminEncryptionData = ""

    -- Don't edit use at your own risk
    saveGlobalStorage = false
    bufferMutedOnSpellFailure = false



my game.cpp

Lua:
bool Game::playerMoveCreature(uint32_t playerId, uint32_t movingCreatureId,
    const Position& movingCreaturePos, const Position& toPos, bool delay)
{
    Player* player = getPlayerByID(playerId);
    if(!player || player->isRemoved() || player->hasFlag(PlayerFlag_CannotMoveCreatures))
        return false;

    if(!player->canDoAction())
    {
        SchedulerTask* task = createSchedulerTask(player->getNextActionTime(),
            boost::bind(&Game::playerMoveCreature, this, playerId, movingCreatureId, movingCreaturePos, toPos, true));
        player->setNextActionTask(task);
        return false;
    }

    Creature* movingCreature = getCreatureByID(movingCreatureId);
    if(!movingCreature || movingCreature->isRemoved() || !player->canSeeCreature(movingCreature))
        return false;

    player->setNextActionTask(NULL);
    if(!Position::areInRange<1,1,0>(movingCreaturePos, player->getPosition()) && !player->hasCustomFlag(PlayerCustomFlag_CanMoveFromFar))
    {
        //need to walk to the creature first before moving it
        std::list<Direction> listDir;
        if(getPathToEx(player, movingCreaturePos, listDir, 0, 1, true, true))
        {
            Dispatcher::getInstance().addTask(createTask(boost::bind(&Game::playerAutoWalk,
                this, player->getID(), listDir)));
            SchedulerTask* task = createSchedulerTask(std::max((int32_t)SCHEDULER_MINTICKS, player->getStepDuration()),
                boost::bind(&Game::playerMoveCreature, this, playerId, movingCreatureId, movingCreaturePos, toPos, true));

            player->setNextWalkActionTask(task);
            return true;
        }

        player->sendCancelMessage(RET_THEREISNOWAY);
        return false;
    }
    else if(delay)
    {
        uint32_t delayTime = g_config.getNumber(ConfigManager::PUSH_CREATURE_DELAY);
        if(delayTime > 0)
        {
            SchedulerTask* task = createSchedulerTask(delayTime,
                boost::bind(&Game::playerMoveCreature, this, playerId, movingCreatureId, movingCreaturePos, toPos, false));
            player->setNextActionTask(task);
            return true;
        }
    }

    Tile* toTile = map->getTile(toPos);
    if(!toTile)
    {
        player->sendCancelMessage(RET_NOTPOSSIBLE);
        return false;
    }

    if(!player->hasFlag(PlayerFlag_CanPushAllCreatures))
    {
        if(!movingCreature->isPushable())
        {
            player->sendCancelMessage(RET_NOTMOVABLE);
            return false;
        }

        if(movingCreature->getNoMove())
        {
            player->sendCancelMessage(RET_NOTPOSSIBLE);
            return false;
        }

        if(toTile->getHeight() > 1)
        {
            player->sendCancelMessage(RET_NOTPOSSIBLE);
            return false;
        }

        if(toTile->hasProperty(BLOCKPATH))
        {
            player->sendCancelMessage(RET_NOTENOUGHROOM);
            return false;
        }
    }

    //check throw distance
    const Position& pos = movingCreature->getPosition();
    if(!player->hasCustomFlag(PlayerCustomFlag_CanThrowAnywhere) && ((std::abs(pos.x - toPos.x) > movingCreature->getThrowRange()) ||
        (std::abs(pos.y - toPos.y) > movingCreature->getThrowRange()) || (std::abs(pos.z - toPos.z) * 4 > movingCreature->getThrowRange())))
    {
        player->sendCancelMessage(RET_DESTINATIONOUTOFREACH);
        return false;
    }

    if(player != movingCreature)
    {
        if(!player->hasFlag(PlayerFlag_IgnoreProtectionZone) && (movingCreature->getZone() == ZONE_PROTECTION
            || movingCreature->getZone() == ZONE_OPTIONAL) && !toTile->hasFlag(TILESTATE_OPTIONALZONE)
            && !toTile->hasFlag(TILESTATE_PROTECTIONZONE))
        {
            player->sendCancelMessage(RET_ACTIONNOTPERMITTEDINANOPVPZONE);
            return false;
        }

        if(!player->hasFlag(PlayerFlag_CanPushAllCreatures))
        {
            if(toTile->getCreatureCount() && !Item::items[
                movingCreature->getTile()->ground->getID()].walkStack)
            {
                player->sendCancelMessage(RET_NOTENOUGHROOM);
                return false;
            }

            if(MagicField* field = toTile->getFieldItem())
            {
                if(field->isUnstepable() || field->isBlocking(movingCreature)
                    || !movingCreature->isImmune(field->getCombatType()))
                {
                    player->sendCancelMessage(RET_NOTPOSSIBLE);
                    return false;
                }
            }

            if(player->isProtected())
            {
                Player* movingPlayer = movingCreature->getPlayer();
                if(movingPlayer && !movingPlayer->isProtected())
                {
                    player->sendCancelMessage(RET_NOTMOVABLE);
                    return false;
                }
            }
        }
    }

    bool deny = false;
    CreatureEventList pushEvents = player->getCreatureEvents(CREATURE_EVENT_PUSH);
    for(CreatureEventList::iterator it = pushEvents.begin(); it != pushEvents.end(); ++it)
    {
        if(!(*it)->executePush(player, movingCreature, toTile) && !deny)
            deny = true;
    }

    if(deny)
        return false;

    ReturnValue ret = internalMoveCreature(player, movingCreature, movingCreature->getTile(), toTile);
    if(ret != RET_NOERROR)
    {
        if(!player->hasCustomFlag(PlayerCustomFlag_CanMoveAnywhere))
        {
            player->sendCancelMessage(ret);
            return false;
        }

        if(!toTile->ground)
        {
            player->sendCancelMessage(RET_NOTPOSSIBLE);
            return false;
        }

        internalTeleport(movingCreature, toTile->getPosition(), false);
    }
    else if(Player* movingPlayer = movingCreature->getPlayer())
    {
        uint64_t delay = OTSYS_TIME() + movingPlayer->getStepDuration();
        if(delay > movingPlayer->getNextActionTime(false))
            movingPlayer->setNextAction(delay);
    }

    return true;
}
 
Back
Top