Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Разделка трупов CUT SOME CORPSE
d`ArcZeal
сообщение 24.9.2018, 10:37
Сообщение #1


**********

Elder
Сообщений: 2.962
Регистрация: 27.11.2005
Группа: Пользователи
Наличность: 7868
Пользователь №: 4.522
Возраст: 34



Версия:
Скрипт для Sphere server 56b-56c

Описание:
С введением данной системы, все полученные ценные ресурсы при освежевании трупа сразу падают в инвентарь игрока.
Можно корректировать какие части тела появляются при разрезании трупа игрока.
Добавлена визуализация.
Понижение известности и кармы при освежевании трупа игрока.
Если в трупе остались вещи, они будут под разрезанным трупом.
После освежевания труп пропадает, что облегчает процесс резки когда вокруг много монстров.
Устранена ситуация когда игрок не знает, какой труп он разрезал а какой еще нет.

Установка:
Все нижеуказанное вставить в любой скрипт до [EOF]

1: Добавляем в TYPE предметов, способных резать, две функции.
Код

[TYPEDEF T_WEAPON_SWORD]
ON=@TARGON_ITEM
IF (<SRC.TARG.TYPE>==T_CORPSE)
    IF (<SRC.TARG.AMOUNT>==400) || (<SRC.TARG.AMOUNT>==401)
    CUTSOMECORPSE
    ELSE
    CUTSOMENPCCORPSE
    ENDIF
RETURN 1
ENDIF

[TYPEDEF T_WEAPON_FENCE]
ON=@TARGON_ITEM
IF (<SRC.TARG.TYPE>==T_CORPSE)
    IF (<SRC.TARG.AMOUNT>==400) || (<SRC.TARG.AMOUNT>==401)
    CUTSOMECORPSE
    ELSE
    CUTSOMENPCCORPSE
    ENDIF
RETURN 1
ENDIF


2: Добавляем скрипт этих двух функций.
Код

[FUNCTION CUTSOMECORPSE]
//Проверка дистанции
IF (<SRC.TARG.DISTANCE> > 3) || !(<SRC.TARG.CANSEELOS>)
SRC.SYSMESSAGE @0486 Too far
RETURN 1
ENDIF

IF (<SRC.TARG.TYPE>==T_CORPSE) && ((<SRC.TARG.AMOUNT>==400) || (<SRC.TARG.AMOUNT>==401))

//Бросаем предметы из трупа на землю.
FORCONT <SRC.TARG.UID>
    IF !(<ATTR>==ATTR_MOVE_NEVER) && !(<ATTR>==ATTR_NEWBIE) && !(<ATTR>==ATTR_INVIS) && !(<ATTR>==attr_static) && !(<TYPE>==T_EQ_SCRIPT) && !(<TYPE>==T_HAIR) && !(<TYPE>==T_BEARd)
    P=<SRC.TARG.P>
    ATTR=<ATTR> | ATTR_DECAY
    TIMER=1800
    ENDIF
ENDFOR

//Создаем человеческие останки
SERV.NEWITEM=I_FLESH_HEAD
    IF (<SRC.TARG.LINK.ISPLAYER>)
    NEW.NAME=head of <SRC.TARG.LINK.NAME>
    ENDIF
NEW.P=<SRC.TARG.P>
NEW.ATTR=ATTR_DECAY
NEW.TIMER=120

SERV.NEWITEM=I_FLESH_torso
NEW.P=<SRC.TARG.P>
NEW.ATTR=ATTR_DECAY
NEW.TIMER=120
SERV.NEWITEM=I_FLESH_LEFT_ARM
NEW.P=<SRC.TARG.P>
NEW.ATTR=ATTR_DECAY
NEW.TIMER=120
SERV.NEWITEM=I_FLESH_RIGHT_ARM
NEW.P=<SRC.TARG.P>
NEW.ATTR=ATTR_DECAY
NEW.TIMER=120
SERV.NEWITEM=I_FLESH_LEFT_LEG
NEW.P=<SRC.TARG.P>
NEW.ATTR=ATTR_DECAY
NEW.TIMER=120
SERV.NEWITEM=I_FLESH_RIGHT_LEG
NEW.P=<SRC.TARG.P>
NEW.ATTR=ATTR_DECAY
NEW.TIMER=120
SERV.NEWITEM=I_SPECIALBLOOD_<EVAL {1 5}>
NEW.P=<EVAL <SRC.TARG.P.X> + {-1 1}>,<EVAL <SRC.TARG.P.Y> + {-1 1}>,<SRC.TARG.P.Z>
NEW.TIMER={4 8}
SRC.ANIM 32

    // Понижаем карму и фаму при порезе трупов
    IF !(<SRC.ACCOUNT.LASTIP>==<SRC.TARG.LINK.ACCOUNT.LASTIP>) && (<SRC.TARG.LINK.ISPLAYER>)
        IF (<SRC.TARG.DTAG0.LINKED_KARMA> > 0)
        SRC.KARMA=<EVAL (<SRC.KARMA> - <EVAL ((<SRC.TARG.DTAG0.LINKED_KARMA>*10)/100)>)>
        SRC.SYSMESSAGE @0486 Вы потеряли <EVAL ((<SRC.TARG.DTAG0.LINKED_KARMA>*10)/100)> кармы.
        ELSE
        SRC.KARMA=<EVAL (<SRC.KARMA> - 500)>
        SRC.FAME=<EVAL (<SRC.FAME> - 300)>
        SRC.SYSMESSAGE @0486 Вы потеряли 500 кармы и 300 известности.
        ENDIF
    ENDIF

SRC.TARG.REMOVE
RETURN 1
ENDIF


Код

[FUNCTION CUTSOMENPCCORPSE]
IF (<SRC.TARG.DISTANCE> > 3) || !(<SRC.TARG.CANSEELOS>)
SRC.SYSMESSAGE @0486 Too far.
RETURN 1
ELIF (<ISEMPTY <SRC.TARG.TAG0.NPCID>>) || (<SRC.TARG.TAG0.CARVED>==1)
SRC.SYSMESSAGE @0486 Вы освежевали труп, но ничего полезного не нашли.
ELIF (<SRC.TARG.TYPE>==T_CORPSE) && (<SRC.TARG.TAG0.CARVED>==0) &&  !(<ISEMPTY <SRC.TARG.TAG0.NPCID>>)
SRC.SYSMESSAGE @0487 Вы разрезали труп на кусочки.

    FOR X 1 <SERV.CHARDEF.<SRC.TARG.TAG0.NPCID>.RESOURCES>
    IF (<SERV.CHARDEF.<SRC.TARG.TAG0.NPCID>.RESOURCES.<LOCAL.X>.VAL> > 0)
    SERV.NEWITEM=<SERV.CHARDEF.<SRC.TARG.TAG0.NPCID>.RESOURCES.<LOCAL.X>.KEY>
    NEW.AMOUNT=<EVAL <SERV.CHARDEF.<SRC.TARG.TAG0.NPCID>.RESOURCES.<LOCAL.X>.VAL>>
    NEW.CONT=<SRC.FINDLAYER.21.UID>
    SRC.ANIM=32
    SRC.SYSMESSAGE @0487 Получено: + <SERV.CHARDEF.<SRC.TARG.TAG0.NPCID>.RESOURCES.<LOCAL.X>.VAL><NEW.NAME>
    ENDIF
    ENDFOR
SRC.TARG.TAG.CARVED=1

FOR X <EVAL (<SRC.TARG.P.X> - 2)> <EVAL (<SRC.TARG.P.X> + 2)>
    FOR Y <EVAL (<SRC.TARG.P.Y> - 2)> <EVAL (<SRC.TARG.P.Y> + 2)>
    IF 30 > <R100>
    SERV.NEWITEM=I_SPECIALBLOOD_<EVAL {1 5}>
    NEW.P=<DLOCAL.X>,<DLOCAL.Y>,<SRC.TARG.P.Z>
    NEW.TIMER={60 70}
    ENDIF

    IF 20 > <R100>
    SERV.NEWITEM=I_SPECIAL_BONE_<EVAL {1 12}>
    NEW.P=<DLOCAL.X>,<DLOCAL.Y>,<EVAL (<SRC.TARG.P.Z> + 1)>
    NEW.TIMER={80 100}
    ENDIF
    ENDFOR
ENDFOR

FORCONT <SRC.TARG.UID>
P=<SRC.TARG.P>
ATTR=<ATTR> | ATTR_DECAY
TIMER=1800
ENDFOR

SRC.TARG.REMOVE

ENDIF
RETURN 1

[EOF]


3: Добавляем предметы для визуализации: кровь и кости.
Код

[ITEMDEF I_SPECIALBLOOD_1]
ID=0122a
TYPE=T_BLOOD
NAME=Blood
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIALBLOOD_2]
ID=0122b
TYPE=T_BLOOD
NAME=Blood
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIALBLOOD_3]
ID=0122c
TYPE=T_BLOOD
NAME=Blood
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIALBLOOD_4]
ID=0122d
TYPE=T_BLOOD
NAME=Blood
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIALBLOOD_5]
ID=0122e
TYPE=T_BLOOD
NAME=Blood
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIAL_BONE_1]
ID=6929
TYPE=T_BONE
NAME=Bone
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIAL_BONE_2]
ID=6930
TYPE=T_BONE
NAME=Bone
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIAL_BONE_3]
ID=6931
TYPE=T_BONE
NAME=Bone
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIAL_BONE_4]
ID=6932
TYPE=T_BONE
NAME=Bone
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIAL_BONE_5]
ID=6933
TYPE=T_BONE
NAME=Bone
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIAL_BONE_6]
ID=6934
TYPE=T_BONE
NAME=Bone
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIAL_BONE_7]
ID=6935
TYPE=T_BONE
NAME=Bone
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIAL_BONE_8]
ID=6936
TYPE=T_BONE
NAME=Bone
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIAL_BONE_9]
ID=6937
TYPE=T_BONE
NAME=Bone
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIAL_BONE_10]
ID=6938
TYPE=T_BONE
NAME=Bone
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIAL_BONE_11]
ID=6939
TYPE=T_BONE
NAME=Bone
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1

[ITEMDEF I_SPECIAL_BONE_12]
ID=6940
TYPE=T_BONE
NAME=Bone
WEIGHT=1

ON=@CREATE
ATTR=ATTR_MOVE_NEVER|ATTR_DECAY

ON=@TIMER
REMOVE
RETURN 1


(IMG:http://olmer.su/img/news_images/23.09.18.jpg)

UPD: Отредактировано благодаря замечаниям Sirocco.


--------------------
Olmer online administrator
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
kklej
сообщение 24.9.2018, 18:08
Сообщение #2


******

Группа: Пользователи
Наличность: 14775
Пользователь №: 13.346



Скрипт выверенный годами сенк
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sirocco
сообщение 25.9.2018, 19:03
Сообщение #3


******

Expert
Сообщений: 809
Регистрация: 2.2.2012
Группа: Пользователи
Наличность: 15408
Пользователь №: 14.566
Возраст: 30



создать 12 предметов I_SPECIAL_BONE_#
видимо в этом был какой-то смысл...
но я его не увидел.

и запустить 2 одинаковых цикла подряд...
тоже мысли не прослеживается.



Код

    FOR X 1 10
    IF (<SERV.CHARDEF.<SRC.TARG.TAG0.NPCID>.RESOURCES.<LOCAL.X>.VAL> > 0)

и вот тут тоже мысль потерялась...
зачем надо с 1 до 10, когда можно сразу узнать сколько надо!



ну и оформление явно хромает
Пользователь в онлайне!Delete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
3 чел. читают эту тему (гостей: 3, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 28.3.2024, 19:28
Designed by Nickostyle