Назад

Аренда вещей

Автор: Kill Spirit: Дата: 12.08.2010

Реализация: Kill Spirit

ВНИМАНИЕ!!! Кастомные айди.

prontera,164,163,3	script	Аренда вещей	86,{
set .@npc1Name$,"[^0000FF Аренда вещей ^000000]";
mes .@npc1Name$;
mes "Приветствую вас!";
next;
if (getgmlevel()>=99) {
mes .@npc1Name$;
mes "Здраствуйте администратор";
switch(select("Обычное меню:Бесплатное меню:Сделать аренду бесплатной:Выйти")){
case 1:
goto L_MAINMENU;

case 2:
goto L_MAINMENU2;

case 3:
mes .@npc1Name$;
mes "Точно?";
if(select("Да:Нет")==2){close;}
next;
if($arendasellno==1){mes .@npc1Name$; mes "Бесплатная аренда уже включена, выключить?"; if(select("Да:Нет")==2){close;} next; set $arendasellno,0; close;}
set $arendasellno,1;
mes .@npc1Name$;
mes "Сделано";
close;

case 4:
mes .@npc1Name$;
mes "Удачного дня!";
close;
}
}
if($arendasellno==1){goto L_MAINMENU2;}
L_MAINMENU:
mes .@npc1Name$;
mes "У меня можно арендовать некоторые вещи на 48 часов.";
mes "";
mes "* Время продолжает идти, даже если вы не играете персонажем.";
next;
mes .@npc1Name$;
mes "Стоимость Ring Of Power: 300кк Zeny За 1 шт.";
mes "";
mes "Стоимость Sleipnirs: 150кк Zeny За 1 шт.";
mes "";
mes "Стоимость Holy Guard: 400кк Zeny За 1 шт.";
if(select("Просмотр списка:Пройти мимо")==2){close;}
next;
mes .@npc1Name$;
mes "Хорошо, но сначало ознакомтесь с правилами аренды, чтобы потом не было вопросов к администрации.";
next;
mes .@npc1Name$;
mes "Вещь нельзя перекинуть на другого персонажа.";
mes "";
mes "А тоесть..если вы арендовали вещь этим персонажем, то передать на другого, у вас уже не получится.";
next;
mes .@npc1Name$;
mes "По истечению срока, вещь удаляется автоматически.";
next;
mes .@npc1Name$;
mes "Вы согласны на данные условия?";
if(select("Да:Нет")==2){close;}
switch(select("Megingjard:Ring Of Vitality:Ring Of Dexterity:Ring Of Intelligence:Sleipnirs:Holy Guard:Выйти")){

case 1:
if(Zeny<300000000){mes .@npc1Name$; mes "У вас нету, необходимой суммы"; close;}
set Zeny,Zeny-300000000;
mes .@npc1Name$;
mes "Удачного дня!";
rentitem 28000,172800;
close;

case 2:
if(Zeny<300000000){mes .@npc1Name$; mes "У вас нету, необходимой суммы"; close;}
set Zeny,Zeny-300000000;
mes .@npc1Name$;
mes "Удачного дня!";
rentitem 28003,172800;
close;

case 3:
if(Zeny<300000000){mes .@npc1Name$; mes "У вас нету, необходимой суммы"; close;}
set Zeny,Zeny-300000000;
mes .@npc1Name$;
mes "Удачного дня!";
rentitem 28004,172800;
close;

case 4:
if(Zeny<300000000){mes .@npc1Name$; mes "У вас нету, необходимой суммы"; close;}
set Zeny,Zeny-300000000;
mes .@npc1Name$;
mes "Удачного дня!";
rentitem 28005,172800;
close;

case 5:
if(Zeny<150000000){mes .@npc1Name$; mes "У вас нету, необходимой суммы"; close;}
set Zeny,Zeny-150000000;
mes .@npc1Name$;
mes "Удачного дня!";
rentitem 28001,172800;
close;

case 6:
if(Zeny<400000000){mes .@npc1Name$; mes "У вас нету, необходимой суммы"; close;}
set Zeny,Zeny-400000000;
mes .@npc1Name$;
mes "Удачного дня!";
rentitem 28002,172800;
close;

case 7:
mes .@npc1Name$;
mes "Удачного дня!";
close;
}
L_MAINMENU2:
mes .@npc1Name$;
mes "У меня можно арендовать некоторые вещи на 48 часов.";
mes "";
mes "* Время продолжает идти, даже если вы не играете персонажем.";
next;
mes .@npc1Name$;
mes "Стоимость Аренды: Бесплатно";
if(select("Просмотр списка:Пройти мимо")==2){close;}
next;
mes .@npc1Name$;
mes "Хорошо, но сначало ознакомтесь с правилами аренды, чтобы потом не было вопросов к администрации.";
next;
mes .@npc1Name$;
mes "Вещь нельзя перекинуть на другого персонажа.";
mes "";
mes "А тоесть..если вы арендовали вещь этим персонажем, то передать на другого, у вас уже не получится.";
next;
mes .@npc1Name$;
mes "По истечению срока, вещь удаляется автоматически.";
next;
mes .@npc1Name$;
mes "Вы согласны на данные условия?";
if(select("Да:Нет")==2){close;}
switch(select("Megingjard:Ring Of Vitality:Ring Of Dexterity:Ring Of Intelligence:Sleipnirs:Holy Guard:Выйти")){

case 1:
mes .@npc1Name$;
mes "Удачного дня!";
rentitem 28000,86400;
close;

case 2:
mes .@npc1Name$;
mes "Удачного дня!";
rentitem 28003,86400;
close;

case 3:
mes .@npc1Name$;
mes "Удачного дня!";
rentitem 28004,86400;
close;

case 4:
mes .@npc1Name$;
mes "Удачного дня!";
rentitem 28005,86400;
close;

case 5:
mes .@npc1Name$;
mes "Удачного дня!";
rentitem 28001,86400;
close;

case 6:
mes .@npc1Name$;
mes "Удачного дня!";
rentitem 28002,86400;
close;

case 7:
mes .@npc1Name$;
mes "Удачного дня!";
close;
}
}


Полностью рабочая и безбаженная аренда вещей, стоит на моём сервере.

Так же есть возможность ставить бесплатную аренду через админ меню.

Меню в админ панели для тестов, если нужно протестировать, но гм акк мешает.

Автор: Alort: Дата: 01.15.2011

[Error]: npc_parsesrcfile: Unknown syntax in file 'npc/custom/arenda_npc.txt', l
ine '3'. Stopping...
* w1=prontera,164,163,3 script └Ёхэфр тх∙хщ 86,{
* w2=
* w3=
* w4=

Вот такая ошибка вылезает в мап сервере при попыике загрузить этот скрипт, в чем проблема?

Автор: DiS[IP]: Дата: 01.15.2011

[FONT=Lucida Console]Табы поставь.[/FONT]

Автор: Alort: Дата: 01.15.2011

А по какому принцыпу их ставить?

Автор: Renegade: Дата: 01.15.2011

prontera,164,163,3[TAB]script[TAB]Аренда вещей[TAB]86,{

Автор: MaXi: Дата: 01.15.2011

Цитата Alort;30399]А по какому принцыпу их ставить?


prontera,164,163,3 [tab] script [tab] Аренда вещей [tab:
86,{

таб находится ниже буквы "Ё"

Автор: Alort: Дата: 01.15.2011

Но неплохо бы ссылочку где можно про это прочитать или типо того, что бы не надоедать с табами)

Автор: MaXi: Дата: 01.15.2011

Dis[IP] не мог бы сделать скрипт не за зени а за Кэш деньги? буду очень тебе блпгодарен!
Alort не понял вопроса! про табы почитать?Оо

Автор: Alort: Дата: 01.15.2011

Цитата MaXi;30403]Dis[IP:

Alort не понял вопроса! про табы почитать?Оо


Ну, по какому принцыпу их ставить, мне непонятно:(

Автор: defo: Дата: 01.16.2011

Cмотрим: prontera,164,163,3 [tab] script [tab] Аренда вещей [tab] 86,{
в нашем случае здесь нужно 3 таба(кнопка под буквой "Ё").
берём, удаляем надписи [tab] и пространство между 164,163,3 и script, что бы символы получились слитно, дальше наводим курсор меджу 3 и s, нажимаем, и ставим TAB, надеюсь так то понятно?

Автор: MaXi: Дата: 01.16.2011

Цитата Alort;30404:
Ну, по какому принцыпу их ставить, мне непонятно:(


Автор: Alort: Дата: 01.16.2011

Цитата MaXi;30451:


Понятно, что ничего не понятно :D

Автор: Alort: Дата: 01.16.2011

Цитата defo;30412]Cмотрим: prontera,164,163,3 [tab] script [tab] Аренда вещей [tab:
86,{
в нашем случае здесь нужно 3 таба(кнопка под буквой "Ё").
берём, удаляем надписи [tab] и пространство между 164,163,3 и script, что бы символы получились слитно, дальше наводим курсор меджу 3 и s, нажимаем, и ставим TAB, надеюсь так то понятно?


Ты немного не понял меня, я спрашивал почему их надо ставить, а каким образом это как бы понятно мне. Ты вот написал: в нашем случае нужно 3 таба, а почему, не сказал:(

Автор: MaXi: Дата: 01.16.2011

Цитата Alort;30457:
Понятно, что ничего не понятно :D


Короче говоря тоже самый что и space только таб специальный)

Автор: Alort: Дата: 01.16.2011

Цитата MaXi;30468:
Короче говоря тоже самый что и space только таб специальный)


:bang:

Автор: Kill Spirit: Дата: 01.16.2011

Найди на клавиатуре кнопку TAB, она под буквой Ё
Выдели область между prontera,164,163,3scriptАренда вещей86 (отмечено красным) и нажми между ними кнопочку таб.

Автор: Ragen: Дата: 01.17.2011

Информация из ea\doc\script_commands.txt

Сдесь описание в каких случаях и как ставить Tabы
Немного не по русски но все впринципе понятно


Script loading structure
------------------------

Scripts are loaded by the map server as referenced in the 'conf/map_athena.conf'
configuration file, but in the default configuration, it doesn't load any script
files itself. Instead, it loads the file 'npc/scripts_main.conf' which itself
contains references to other files. The actual scripts are loaded from txt
files, which are linked up like this:

npc:

Any line like this, invoked, ultimately, by 'map_athena.conf' will load up the
script contained in this file, which will make the script available. No file
will get loaded twice, to prevent possible errors.

Another configuration file option of relevance is:

delnpc:

This will unload a specifiled script filename from memory, which, while
seemingly useless, may sometimes be required.

Whenever '//' is encountered in a line upon reading, everything beyond this on
that line is considered to be a comment and is ignored. This works wherever you
place it.

Upon loading all the files, the server will execute all the top-level commands
in them. No variables exist yet at this point, no commands can be called other
than those given in this section. These commands set up the basic server script
structure - create NPC objects, spawn monster objects, set map flags, etc. No
code is actually executed at this point except them. The top-level commands the
scripting are pretty confusing, since they aren't structured like you would
expect commands, command name first, but rather, normally start with a map name.

What's more confusing about the top-level commands is that most of them use a
tab symbol to divide their arguments.

To prevent problems and confusion, the tab symbols are written as '%TAB%'
throughout this document, even though this makes the text a bit less readable.
Using an invisible symbol to denote arguments is one of the bad things about
this language, but we're stuck with it for now. :)

Here is a list of valid top-level commands:

** Set a map flag:

%TAB%mapflag%TAB%

This will, upon loading, set a specified map flag on a map you like. These are
normally in files inside 'conf/mapflag' and are loaded first, so by the time the
server's up, all the maps have the flags they should have. Map flags determine
the behavior of the map regarding various common problems, for a better
explanation, see 'setmapflag'.

** Create a permanent monster spawn:

,,,,%TAB%monster%TAB%%TAB%,,,,

Map name is the name of the map the monsters will spawn on. x,y are the
coordinates where the mob should spawn. If xs and ys are non-zero, they
specify the diameters of a spawn-rectangle area who's center is x,y.
Putting zeros instead of these coordinates will spawn the monsters randomly.
Note this is only the initial spawn zone, as mobs random-walk, they are free
to move away from their specified spawn region.

Monster name is the name the monsters will have on screen, and has no relation
whatsoever to their names anywhere else. It's the mob id that counts, which
identifies monster record in 'mob_db.txt' database of monsters. If the mob name
is given as "--ja--", the 'japanese name' field from the monster database is
used, (which, in eAthena, actually contains an english name) if it's "--en--",
it's the 'english name' from the monster database (which contains an uppercase
name used to summon the monster with a GM command).

If you add 20000 to the monster ID, the monster will be spawned in a 'big
version', (monster size class will increase) and if you add 10000, the 'tiny
version' of the monster will be created. However, this method is deprecated
and not recommended, as the values to add can change at a later time (20000
and 10000 actually stand for 2*MAX_MOB_DB and MAX_MOB_DB respectively, which
is defined on mob.h, and can change in the future as more mobs are created).
The recommended way to change a mob's size is to use the event-field (see
below).

Amount is the amount of monsters that will be spawned when this command is
executed, it is affected by spawn rates in 'battle_athena.conf'.

Delay1 and delay2 are the monster respawn delays - the first one counts the time
since a monster defined in this spawn was last respawned and the second one
counts the time since the monster of this spawn was last killed. Whichever turns
out to be higher will be used. If the resulting number is smaller than a random
value between 5 and 10 seconds, this value will be used instead. (Which is
normally the case if both delay values are zero.) The times are given in
1/1000ths of a second.

You can specify a custom level to use for the mob different from the one of
the database by adjoining the level after the name with a comma. eg:
"Poring,50" for a name will spawn a monster with name Poring and level 50.

Event is a script event to be executed when the mob is killed. The event must
be in the form "NPCName::OnEventName" to execute, and the event name label
should start with "On". As with all events, if the NPC is an on-touch npc, the
player who triggers the script must be within 'trigger' range for the event to
work.

The Event field can be used alternatively to specify other mob properties. Use
2 to specify that the mob should be small, 4 for big monsters, and 8 for
special ai mobs (which by default attack other monsters instead of players).
You can add these, so using 10 will spawn small monsters that attack other
mobs (if you specify both 2 and 4, the small version takes priority).

** Npc names

/!\ WARNING: this applies to warps, npcs, duplicates and shops /!\

Npc names are kinda special and are formatted this way:

{::}

All npcs need to have a unique name that is used for identification purposes.
When you have to identify a npc by it's name, you should use .
If is not provided, use instead.

The client has a special feature when displaying names:
if the display name contains a '#' character, it hides that part of the name.
ex: if your npc is named 'Hunter#hunter1', it will be displayed as 'Hunter'

must be at most 24 characters in length.
must be at most 24 characters in length.

** Define a warp point

,,,%TAB%warp%TAB%%TAB%,,,,

This will define a warp NPC that will warp a player between maps, and while most
arguments of that are obvious, some deserve special mention.

SpanX and SpanY will make the warp sensitive to a character who didn't step
directly on it, but walked into a zone which is centered on the warp from
coordinates and is SpanX in each direction across the X axis and SpanY in each
direction across the Y axis.

Warp NPC objects also have a name, because you can use it to refer to them later
with 'enablenpc'/'disablenpc'

Facing of a warp object is irrelevant, it is not used in the code and all
current scripts have a zero in there.

** Define an NPC object.

,,,%TAB%script%TAB%%TAB%,{}
,,,%TAB%script%TAB%%TAB%,,,{}

This will place an NPC object on a specified map at the specified location, and
is a top-level command you will use the most in your custom scripting. The NPCs
are triggered by clicking on them, and/or by walking in their trigger area, if
defined, see that below.

Facing is a direction the NPC sprite will face in. Not all NPC sprites have
different images depending on the direction you look from, so for some facing
will be meaningless. Facings are counted counterclockwise in increments of 45
degrees, where 0 means facing towards the top of the map. (So to turn the sprite
towards the bottom of the map, you use facing 4, and to make it look southeast
it's facing 5.)

Sprite id is the sprite number used to display this particular NPC. For a full
list of sprite id numbers see http://kalen.s79.xrea.com/npc/npce.shtml You may
also use a monster's ID number instead to display a monster sprite for this NPC.
It is possible to use a job sprite as well, but you must first define it as a
monster sprite in 'mob_avail.txt', a full description on how to do this is not
in the scope of this manual.
A '-1' sprite id will make the NPC invisible (and unclickable).
A '111' sprite id will make an NPC which does not have a sprite, but is still
clickable, which is useful if you want to make a clickable object of the 3D
terrain.

TriggerX and triggerY, if given, will define an area, centered on NPC and
spanning triggerX cells in every direction across X and triggerY in every
direction across Y. Walking into that area will trigger the NPC. If no
'OnTouch:' special label is present in the NPC code, the execution will start
from the beginning of the script, otherwise, it will start from the 'OnTouch:'
label.

The code part is the script code that will execute whenever the NPC is
triggered. It may contain commands and function calls, descriptions of which
compose most of this document. It has to be in curly brackets, unlike elsewhere
where we use curly brackets, these do NOT signify an optional parameter.

** Define a 'floating' NPC object.

-%TAB%script%TAB%%TAB%-1,{}

This will define an NPC object not triggerable by normal means. This would
normally mean it's pointless since it can't do anything, but there are
exceptions, mostly related to running scripts at specified time, which is what
these floating NPC objects are for. More on that below.

** Define a shop/cashshop NPC.

-%TAB%shop%TAB%%TAB%,:{,:...}
,,,%TAB%shop%TAB%%TAB%,:{,:...}

This will define a shop NPC, which, when triggered (which can only be done by
clicking) will cause a shop window to come up. No code whatsoever runs in shop
NPCs and you can't change the prices otherwise than by editing the script
itself. (No variables even exist at this point of scripting, so don't even
bother trying to use them.)

The item id is the number of item in the 'item_db.txt' database. If Price is set
to -1, the 'buy price' given in the item database will be used. Otherwise, the
price you gave will be used for this item, which is how you create differing
prices for items in different shops.

Since trunk r12264 you can alternatively use "cashshop" in place of "shop"
to use the Cash Shop interface, allowing you to buy items with special points
(Currently stored as account vars in global_reg #CASHPOINTS and #KAFRAPOINTS.)
This type of shop will not allow you to sell items at it, you may only
purchase items here. The layout used to define sale items still count, and
"" refers to how many points will be spent purchasing the them.

** Define an warp/shop/cashshop/NPC duplicate.

warp: ,,,%TAB%duplicate(

Автор: Alort: Дата: 01.17.2011

Вот, Regen респект, именно это я и хотел, то что нужно!

Автор: Asuma: Дата: 01.17.2011

Цитата Dis[IP];27228:
[FONT=Lucida Console]Крутой говнокод...:lol:
Надо писать код так,чтобы люди читающие его могли разобраться в нем.Вместо твоих 184 строк вышло 87.Думаю разницу ты заметишь сразу.
Вот так этот скрипт лучше смотрится:[/FONT]

// Основа и идея скрипта by Kill Spirit
// Нормальный человечный код by DiS[IP]
prontera,164,163,3 script Аренда вещей 86,{
set .@npc$,"[^0000FF Аренда вещей ^000000]";
if(getgmlevel()==99){
mes .@npc$;
mes "Привет,администратор!";
switch(select("Обычное меню:Сделать аренду бесплатной:Выход")){
case 1:
goto L_menu;
case 2:
mes .@npc$;
mes "Вы уверены?";
if(select("Да:Нет")==2){ close; }
next;
if($arenda==1){mes .@npc$; mes "Бесплатная аренда уже включена, выключить?"; if(select("Да:Нет")==2){ close; } set $arenda,0; close; }
mes .@npc$;
mes "Готово";
set $arenda,1;
close;
case 3:
close;
}
}
mes .@npc$;
mes "Привет,"+strcharinfo(0)+"!";
next;
goto L_menu;
L_menu:
mes .@npc$;
mes "У меня можно арендовать некоторые вещи на 48 часов.";
mes "*Время продолжает идти,даже если вы не играете персонажем.";
next;
if($arenda==0){
mes .@npc$;
mes "Стоимость Ring Of Power: 300кк Zeny За 1 шт.";
mes "Стоимость Sleipnirs: 150кк Zeny За 1 шт.";
mes "Стоимость Holy Guard: 400кк Zeny За 1 шт.";
} else { mes "Стоимость Аренды: Бесплатно"; }
next;
mes .@npc$;
mes "Ознакомтесь с правилами аренды, чтобы потом не было вопросов к администрации.";
next;
mes .@npc$;
mes "Вещь нельзя перекинуть на другого персонажа.";
mes "А то есть..если вы арендовали вещь этим персонажем,то передать на другого,у вас уже не получится.";;
mes "По истечению срока,вещь удаляется автоматически.";
next;
mes .@npc$;
mes "Вы согласны на данные условия?";
if(select("Да:Нет")==2){ close; }
mes "Какую вещь хотите взять в аренду?";
set @disip,select("Megingjard",
"Ring Of Vitality",
"Ring Of Dexterity",
"Ring Of Intelligence",
"Sleipnirs",
"Holy Guard");
setarray @DISID[0],20800,300000000,
20803,300000000,
20804,300000000,
28005,300000000,
28001,150000000,
28002,400000000;
setarray @DISIPID[0],20800,0,
20803,0,
20804,0,
28005,0,
28001,0,
28002,0;
set @disip,@disip - 1;
next;
mes .@npc$;
mes "Вы уверены что хотите взять эту вещь в аренду?";
if(select("Да:Нет")==2){ close; }
if($arenda==0){
if(Zeny<@DISID[@disip*2+1]){ next; mes .@npc$; mes "А где деньги?Приходи когда будут!"; close; }
mes .@npc$;
mes "Удачного дня!";
set Zeny,Zeny-@DISID[@disip*2+1];
rentitem @DISID[@disip*2],172800;
close;
} else {
mes .@npc$;
mes "Удачного дня!";
rentitem @DISIPID[@disip*2],86400;
close;
}
}


Не читабильно, и тоже быдло код из-за goto.

Автор: Cole McCormick: Дата: 01.17.2011

Сможешь лучше?:)

Автор: Asuma: Дата: 01.17.2011

Цитата Naota;30551:
Сможешь лучше?:)


Да, только мне недосуг.