Allods Developers Community

This is a sample guest message. Register a free account today to become a member! Once signed in, you'll be able to participate on this site by adding your own topics and posts, as well as connect with other members through your own private inbox!

Аллоды 1.0.02.0/1.1.02 + ЛР - запуск локального сервера в 2 клика

Как говорится "обещанного три года ждут" я справился быстрее) сегодня дропаю 1.0 сервер с оптимизацией контейнеров, упрощенной установкой, с 3 наемниками и пчелой собирающей лут (типа сороки)

Allods_260823_183324.jpg
Post automatically merged:

You do not have permission to view link Log in or register now.

Требования по установке те же, устанавливаем то же ПО что и в инструкции в шапке, распаковываем клиент (AllodsClient GO 1_0_02_0) и сервер (AO docker 1.0.02.0)

Клиент запускаем через батник в корне папки (StartRelease.bat)

Сервер запускаем через Start.bat. Если это первый запуск в батнике выбираем пункт "4. Создать volume и импортировать server_data1.0.tar.gz (первый запуск)" для распаковки серверных файлов в volume докера (это замена пункта инструкции "Открываем Docker Desktop -> Volumes и создаем здесь server_data1.0 или server_data1.1 в зависимости от версии сервера") процесс занимает какое то время, зависит от скорости носителя и мощности ПК. Дожидаемся завершения распаковки после чего можно переходить к запуску, пункт "1. Запустить контейнеры "docker compose up -d --wait""

первый старт будет дольше последующих

После старта можно заходить на сервер, в базе уже есть 1 аккаунт login: Stroti pass: 123 создать новый можно тут
You do not have permission to view link Log in or register now.


наемников можно призвать после 5 уровня (ограничения по локациям нет, можно с ними бегать везде), свиток изучения находится в лавке редкости раздел Услуги > Тренировка

при разработке использовал ИИ, просьба строго не судить 😅 на сколько мог протестировал, но не исключаю что может быть полно недоработок которые я не учел. О таких находках можете писать сюда, по возможности буду править.
 
Last edited:
при разработке использовал ИИ, просьба строго не судить 😅
ИИ-шница реплику с версий постарше делала, включая xml? Лениво было копаться, но на 1.1 реплика наймов пригодилась бы.

Такого файла вроде нет в архивах, но есть в index.srv
2147418123#/Mechanics/AI/CasterPetBrain.xdb.xdb
Есть, измененные:
64102#/Mechanics/AI/PetBrain.xdb (был в оригинале index.srv
2147418122#/Mechanics/AI/AssistantBrain.xdb (в index.srv нет
 
ИИ-шница реплику с версий постарше делала, включая xml? Лениво было копаться, но на 1.1 реплика наймов пригодилась бы.

Такого файла вроде нет в архивах, но есть в index.srv

Есть, измененные:
Не, файлы 4.0 не подходят для переноса, там слишком много зависимостей, которых нет в 1.0, по этому файлами 4.0 мы только вдохновлялись, и писали классы с нуля. На 1.1 перенести их вряд ли получится, так как по мимо серверного патча, я ещё делал патч клиента, для отображения наймов в виде группы (клиент по умолчанию так не умеет). Хотя возможно есть способ, патч клиента в виде аддона подкинуть, может и прокатит.
 
по этому файлами 4.0 мы только вдохновлялись, и писали классы с нуля.
А сорсы нам расшарят?

256x2563.jpg
Post automatically merged:

наемников можно призвать после 5 уровня (ограничения по локациям нет, можно с ними бегать везде), свиток изучения находится в лавке редкости раздел Услуги > Тренировка
Если надо кому, пускай будет
Code:
package gameMechanics.elements.predicates;

import gameMechanics.map.scriptZone.*;
import org.jetbrains.annotations.*;
import annotations.attributes.*;
import gameMechanics.world.creature.*;
import identity.*;
import gameMechanics.constructor.basicInterfaces.*;
import gameMechanics.constructor.schemes.action.*;
import msgSystem.locales.*;
import resourceDB.resources.*;
import ioBase.*;

// Проверка карты:
import gameMechanics.world.avatar.*;
// import mapLoader.*;
import gameMechanics.map.zone.*;
//import gameMechanics.constructor.basicElements.*;
import gameMechanics.constructor.basicElements.ActionFailCause;
import gameMechanics.constructor.basicElements.Predicate;
import gameMechanics.constructor.basicElements.PredicatesHelper;

@Description("Проверяет на соответсвие аватара определнной карте:")
public class PredicateMercenariesMap extends Predicate
{
    @DenyDefault
    @NotNull
    private ZoneResource Oreshek;
    @NotNull
    private ZoneResource XAES;
    @NotNull
    private ZoneResource LagunaBoil;
    @NotNull
    private ZoneResource DarkbloodCitadel;
    @NotNull
    private ZoneResource PlagueCastle;
    @NotNull
    private ZoneResource HeartofTensessTemple;
    @NotNull
    private ZoneResource LabThirteen;

    @NotNull
    @Override
    public ActionFailCause getFailCause(@NotNull final Creature creature) { return ActionFailCause.NotInScriptZone; }

    @Override
    public boolean isOk(@NotNull final CreatureReplica creature)
    {
        if(!(creature instanceof Avatar)) { return false; }
        final Avatar avatar = (Avatar)creature;
        // final MapResource avatar_map = avatar.getIds().getMap();
        final ZoneResource avatar_map = avatar.getMechanics().getZone();
        if(this.Oreshek.equals(avatar_map)) {
            return true;
        } else if(this.XAES.equals(avatar_map)) {
            return true;
        } else if(this.LagunaBoil.equals(avatar_map)) {
            return true;
        } else if(this.DarkbloodCitadel.equals(avatar_map)) {
            return true;         
        } else if(this.PlagueCastle.equals(avatar_map)) {
            return true; 
        } else if(this.HeartofTensessTemple.equals(avatar_map)) {
            return true;
        } else if(this.LabThirteen.equals(avatar_map)) {
            return true;
        }
        return false;
    }

    @Override
    public void readCpp(@NotNull final SerializationDataInput in) throws SerializationException
    {
        super.readCpp(in);
        try
        {
            this.Oreshek = (ZoneResource)Resource.createFromCpp(in, (Class)ZoneResource.class);
            this.XAES = (ZoneResource)Resource.createFromCpp(in, (Class)ZoneResource.class);
            this.LagunaBoil = (ZoneResource)Resource.createFromCpp(in, (Class)ZoneResource.class);
            this.DarkbloodCitadel = (ZoneResource)Resource.createFromCpp(in, (Class)ZoneResource.class);
            this.PlagueCastle = (ZoneResource)Resource.createFromCpp(in, (Class)ZoneResource.class);
            this.HeartofTensessTemple = (ZoneResource)Resource.createFromCpp(in, (Class)ZoneResource.class);
            this.LabThirteen = (ZoneResource)Resource.createFromCpp(in, (Class)ZoneResource.class);
        }
        catch (ClassCastException e) {
            throw new SerializationException("ClassCastException", (Throwable)e);
        }
    }

    @Override
    public void writeCpp(@NotNull final SerializationDataOutput out) throws SerializationException
    {
        super.writeCpp(out);
        this.Oreshek.writeCpp(out);
        this.XAES.writeCpp(out);
        this.LagunaBoil.writeCpp(out);
        this.DarkbloodCitadel.writeCpp(out);
        this.PlagueCastle.writeCpp(out);
        this.HeartofTensessTemple.writeCpp(out);
        this.LabThirteen.writeCpp(out);
    }
}
Code:
package gameMechanics.elements.predicates;

import annotations.attributes.*;
import org.jetbrains.annotations.*;
import gameMechanics.world.gameRoot.*;
import resourceDB.xdb.*;
import gameMechanics.world.avatar.*;
import gameMechanics.world.creature.*;
import gameMechanics.constructor.basicElements.*;
import gameMechanics.tools.*;
import asserts.*;

// Проверка на Астральный остров:
import gameMechanics.map.instance.astralIsland.*;

@Description("Проверка находится ли персонаж на острове.")
public class PredicateNotOnIslandCustom extends Predicate
{
    @Override
    public boolean isOk(@NotNull final CreatureReplica creature)
    {
        if(creature.getIds().getMap().getMapTemplate().getEntrance() instanceof AstralIslandEntrance)
        {
            return false;
        }
        return true;
    }
}
Code:
Проверка нахождения персонажа в героиках:
    <Item type="gameMechanics.elements.predicates.PredicateMercenariesMap">
        <Oreshek href="/Maps/Inst_Liga1End/Zones/Inst_Liga1End/Inst_Liga1End.(ZoneResource).xdb#xpointer(/gameMechanics.map.zone.ZoneResource)" />
        <XAES href="/Maps/Inst_Empire1End/Zones/Inst_Empire1End/Inst_Empire1End.(ZoneResource).xdb#xpointer(/gameMechanics.map.zone.ZoneResource)" />
        <LagunaBoil href="/Maps/Hadagan_E3_Miniinst/Zones/ZoneEmpire3/ZoneEmpire3.(ZoneResource).xdb#xpointer(/gameMechanics.map.zone.ZoneResource)" />
        <DarkbloodCitadel href="/Maps/Inst_Liga3End/Zones/Inst_Liga3End/Inst_Liga3End.(ZoneResource).xdb#xpointer(/gameMechanics.map.zone.ZoneResource)" />
        <PlagueCastle href="/Maps/Inst_PlagueCastle/Zones/PlagueCastle/PlagueCastle.(ZoneResource).xdb#xpointer(/gameMechanics.map.zone.ZoneResource)" />
        <HeartofTensessTemple href="/Maps/Inst_TenzisTemple/Zones/Inst_TenzisTemple/Inst_TenzisTemple.(ZoneResource).xdb#xpointer(/gameMechanics.map.zone.ZoneResource)" />
        <LabThirteen href="/Maps/Inst_SecretLab/Zones/Inst_SecretLab/Inst_SecretLab.(ZoneResource).xdb#xpointer(/gameMechanics.map.zone.ZoneResource)" />
    </Item>
 
Last edited:
Back
Top