Премиум аккаунт на персонажа

  • Автор темы Автор темы hahahan
  • Дата начала Дата начала

hahahan

Единомышленник
Местный
Сообщения
49
Розыгрыши
0
Репутация
-1
Реакции
19
Баллы
148
Хроники
  1. Interlude
Исходники
Присутствуют
Сборка
lucera 1.7
Добрый день. Хотел задать вопрос.
На сервере есть возможность приобрести Премиум аккаунт. При покупке премиума, он дается не на конкретного персонажа, а не весь аккаунт, с которого был куплен. Получается, что все последующие персонажи будут получать премиум автоматически(ну или предыдущие)
Как это исправить? В конфигах такой настройки нет. Там только вкл/выкл, рейты.

Покапался немного в файлах, нашел внутри по пути \game\data\scripts\custom\Services

файлик Services.java

в нем как раз все услуги, включая премиум аккаунт. Я вот тут скопировал часть.
// Премиум аккаунт
int premiumItemIt1 = 9558;
int premiumItemCount1 = 1;
int premiumItemIt2 = 9558;
int premiumItemCount2 = 2;
int premiumItemIt3 = 9558;
int premiumItemCount3 = 4;
int premiumItemIt4 = 9558;
int premiumItemCount4 = 5;
int premiumItemIt5 = 9558;
int premiumItemCount5 = 8;

public Services(int questId, String name, String descr)
{
super(questId, name, descr);

addStartNpc(ServicesNpcId);
addFirstTalkId(ServicesNpcId);
addTalkId(ServicesNpcId);
}

public static void main(String[] args)
{
new Services(-1, Services.class.getSimpleName(), "custom");
}

@Override
public String onFirstTalk(L2NpcInstance npc, L2PcInstance player)
{
if (player.getQuestState(getName()) == null)
{
newQuestState(player);
}
else if (player.isInCombat())
{
return "Services-Blocked.htm";
}
else if (player.getPvpFlag() == 1)
{
return "Services-Blocked.htm";
}
else if (player.getKarma() != 0)
{
return "Services-Blocked.htm";
}
else if (player.isDead() || player.isFakeDeath())
{
return "Services-Blocked.htm";
}

return "Services.htm";
}

@Override
public String onAdvEvent(String event, L2NpcInstance npc, L2PcInstance player)
{
String htmlText = event;
QuestState st = player.getQuestState(getName());

if (event.equals("getPremium1"))
{
if (player.getPremiumService() == 0)
{
if (st.getQuestItemsCount(premiumItemIt1) >= premiumItemCount1)
{
st.takeItems(premiumItemIt1, premiumItemCount1);
PcAction.addPremiumServices(player, 1, player.getAccountName());
player.broadcastUserInfo();
return "PremiumAccount-Success.htm";
}
return "PremiumAccount-NoItems.htm";
}
return "PremiumAccount-Alredy.htm";
}

if (event.equals("getPremium2"))
{
if (player.getPremiumService() == 0)
{
if (st.getQuestItemsCount(premiumItemIt2) >= premiumItemCount2)
{
st.takeItems(premiumItemIt2, premiumItemCount2);
PcAction.addPremiumServices(player, 3, player.getAccountName());
player.broadcastUserInfo();
return "PremiumAccount-Success.htm";
}
return "PremiumAccount-NoItems.htm";
}
return "PremiumAccount-Alredy.htm";
}

if (event.equals("getPremium3"))
{
if (player.getPremiumService() == 0)
{
if (st.getQuestItemsCount(premiumItemIt3) >= premiumItemCount3)
{
st.takeItems(premiumItemIt3, premiumItemCount3);
PcAction.addPremiumServices(player, 7, player.getAccountName());
player.broadcastUserInfo();
return "PremiumAccount-Success.htm";
}
return "PremiumAccount-NoItems.htm";
}
return "PremiumAccount-Alredy.htm";
}

if (event.equals("getPremium4"))
{
if (player.getPremiumService() == 0)
{
if (st.getQuestItemsCount(premiumItemIt4) >= premiumItemCount4)
{
st.takeItems(premiumItemIt4, premiumItemCount4);
PcAction.addPremiumServices(player, 14, player.getAccountName());
player.broadcastUserInfo();
return "PremiumAccount-Success.htm";
}
return "PremiumAccount-NoItems.htm";
}
return "PremiumAccount-Alredy.htm";
}

if (event.equals("getPremium5"))
{
if (player.getPremiumService() == 0)
{
if (st.getQuestItemsCount(premiumItemIt5) >= premiumItemCount5)
{
st.takeItems(premiumItemIt5, premiumItemCount5);
PcAction.addPremiumServices(player, 30, player.getAccountName());
player.broadcastUserInfo();
return "PremiumAccount-Success.htm";
}
return "PremiumAccount-NoItems.htm";
}
return "PremiumAccount-Alredy.htm";
}

Возможно ли всё это исправить на выдачу персонажу?
 
Возможно, но придется подправить табличку в бд и в исходах несколько запросов.
То есть нам потребуется отдельная таблица с записью на персонажа. (или дописать просто параметр в characters)

Выдает на аккаунт потому что туда идет запись, нам нужно будет создать отдельный сервис с колонкой именно на чара, а не в колонку логинов. В целом это поправить - минут 10 работы в исходе.
 
Возможно, но придется подправить табличку в бд и в исходах несколько запросов.
То есть нам потребуется отдельная таблица с записью на персонажа. (или дописать просто параметр в characters)

Выдает на аккаунт потому что туда идет запись, нам нужно будет создать отдельный сервис с колонкой именно на чара, а не в колонку логинов. В целом это поправить - минут 10 работы в исходе.
Ну, добавлю что всё таки будет чуть дольше, параметры которые берутся, для премиума находятся в L2PcInstance
Java:
    public long getPremiumService() {
        return getAccountData().getLong("premium", 0);
    }

Где это всё соответственно подвязано на accounts_data, где указаны исключительно логины.
Далее, помимо проверки према из колонки, надо еще добавить правильный set, ибо сейчас в люсе он выглядит вот так:
Java:
    public void setPremiumService(long PS) {
        getAccountData().set("premium", PS);
        if (PS > 0) {
            for (int skid : Config.PREMIUM_SKILLS.keySet()) {
                L2Skill sk = SkillTable.getInstance().getInfo(skid, Config.PREMIUM_SKILLS.get(skid));
                if (sk != null && getSkillLevel(skid) < sk.getLevel()) {
                    addSkill(sk, false);
                }

            }
        }
    }

В целом видится добавление еще одного столбца, вывод этой переменной внутрь новой переменной (условной i) и уже её проверка и назначение в двух методах (getPremiumService и setPremiumService)


Оффтоп:
В целом, настоятельно советовал бы не иметь дел с люсей (особенно в оригинале), проблем там вагон и маленькая тележка, лучше отказаться сразу, чем фэйлить открытие.
 
Боюсь работяги не оценят покупку премиума на каждого персонажа
 
Решение
Боюсь работяги не оценят покупку премиума на каждого персонажа
Я считаю что это самый лучший ответ.
Хотя другие ответы, которые прозвучали выше, имеют место быть. Ведь кто-то всё равно захочет это сделать
 
Назад
Сверху Снизу