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

 
Ответить в эту темуОткрыть новую тему
> Удаление привязанных друг к другу вещей
d`ArcZeal
сообщение 19.6.2017, 20:11
Сообщение #1


**********

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



Когда игрок марчит местность, под ним создается видимый игрокам предмет.
Предупреждающий, что местность замарчена, тут не стоит ставить базу, дом, загон для животных и тд.

Код

SERV.NEWITEM=I_RUNEBOOK_RUNE

//Запись тэгов на руну на земле
NEW.TAG.LINKED_RUNEBOOK=<UID>
NEW.TAG.LINKED_RUNEBOOK_SLOT=<DLOCAL.FREE_SPACE>
NEW.TAG.LINKED_OWNER_UID=<SRC.UID>
NEW.TAG.LINKED_OWNER_NAME=<SRC.NAME>

TAG.LINKED_RUNE_<DLOCAL.FREE_SPACE>=<NEW.UID>
NEW.P=<SRC.P.X>,<SRC.P.Y>,<EVAL (<SRC.P.Z> - 1)>,<SRC.P.M>


Когда игрок стирает запись в рунбуке - данный видимый предмет удаляется

Код

[FUNCTION REMOVE_RUNE]
//SERV.NEWITEM=I_RETURN_RUNE
//NEW.BOUNCE

TRY TAG.RUNEBOOK.<EVAL <ARGV[0]>>=
TRY TAG.RUNEBOOK.LOCATION.<EVAL <ARGV[0]>>=

IF <ARGV[0]> < 16
FOR <EVAL <ARGV[0]>+1> 16
    IF !<ISEMPTY <TAG.RUNEBOOK.<EVAL <LOCAL._FOR>>>>
    TRY TAG.RUNEBOOK.<EVAL <LOCAL._FOR>+-1>=<TAG.RUNEBOOK.<EVAL <LOCAL._FOR>>>
    TRY TAG.RUNEBOOK.LOCATION.<EVAL <LOCAL._FOR>+-1>=<TAG.RUNEBOOK.LOCATION.<EVAL <LOCAL._FOR>>>
    TRY TAG.RUNEBOOK.<EVAL <LOCAL._FOR>>=
    TRY TAG.RUNEBOOK.LOCATION.<EVAL <LOCAL._FOR>>=
    ENDIF
ENDFOR
ENDIF


Не решена проблема засорения мира такими предметами.
К примеру когда игрок продал НПС/удалил рунбуку из игры.

Какую функцию необходимо написать, которая будет проверять все I_RUNEBOOK_RUNE на наличие рунбуки, к которой они привязаны? А если рунбуки в игре нет - удалять их.

Код

[FUNCTION CHECK_RUNEBOOK_RUNE]
FORINSTANCES I_RUNEBOOK_RUNE
...
ENDFOR


Спасибо всем, кто откликнется.

(IMG:http://ximages.net/images/71152464687249548233.png)


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


**********

Модератор RunUO
Сообщений: 3.425
Регистрация: 1.11.2008
Группа: Супермодераторы
Наличность: 22565
Из: Северная Корея
Пользователь №: 11.273



Если есть доступ к событию типа "OnDelete", то просто проверять содержимое рунабуки на такого рода записи и чистить привязки.

Либо добавить марку ссылки на записи, и к примеру во время каждого сейва проверять, если у какого то либо марка ссылка введет на NULL, то удалять марк.


--------------------
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
d`ArcZeal
сообщение 19.6.2017, 21:47
Сообщение #3


**********

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



@OnDelete
Срабатывает ВСЕГДА когда предмет исчезает с сервера (удаление, продажа, пропажа на земле) ?>

> если у какого то либо марка ссылка введет на NULL
Вот это и не знаю как написать.


--------------------
Olmer online administrator
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sirocco
сообщение 19.6.2017, 23:09
Сообщение #4


******

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



а что разве сфера сама не чистит от мусорных линков.
надо было эти метки линковать их бы автоматически удалило по ошибке
Invalid code=2205

а то навыдумываю функций... еще и тагов лишних мешок, а достаточно было бы ссылки на рунбук.


Код

[FUNCTION CHECK_RUNEBOOK_RUNE]
ref1 = <uid>
FORINSTANCES I_RUNEBOOK_RUNE
  ref2 = <TAG.LINKED_RUNEBOOK>
  if <ref2.baseid> != i_runebook
    remove
  else
    ref1.link = <ref2.uid>
  endif
ENDFOR
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
d`ArcZeal
сообщение 19.6.2017, 23:47
Сообщение #5


**********

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



Код

//Удаляем все марки от не имеющихся рунбуков
[FUNCTION CHECK_RUNEBOOK_RUNE]
IF (<EVAL <SERV.RTIME.FORMAT %H>>==0) && (<EVAL <SERV.RTIME.FORMAT %M>>==5)
REF1 = <UID>
FORINSTANCES I_RUNEBOOK_RUNE
REF2 = <TAG0.LINKED_RUNEBOOK>
    IF (<REF2.BASEID> != I_RUNEBOOK)
    SERV.LOG <UID> -> HAVE NOT: <REF2.BASEID> <REF2.UID>
    REMOVE
    //ELSE
    //SERV.LOG <UID> -> <REF2.NAME> <REF2.UID>
    ENDIF
ENDFOR
ENDIF

//Удаляем все марки от не имеющихся звезд возврата
[FUNCTION CHECK_STAR_OF_RETURN_RUNE]
//IF (<EVAL <SERV.RTIME.FORMAT %H>>==0) && (<EVAL <SERV.RTIME.FORMAT %M>>==5)
REF1 = <UID>
FORINSTANCES I_STAR_OF_RETURN_RUNE
REF2 = <TAG0.LINKED_RUNEBOOK>
    IF (<REF2.BASEID> != I_RETURN_RUNE)
    SERV.LOG <UID> -> HAVE NOT: <REF2.BASEID> <REF2.UID>
    REMOVE
    //ELSE
    //SERV.LOG <UID> -> <REF2.NAME> <REF2.UID>
    ENDIF
ENDFOR
//ENDIF


Через линки не хочу работать, старая привычка, когда от них падала 0.51 сфера.
Спасибо.

(IMG:https://vibiri.files.wordpress.com/2010/10/761.jpg)


--------------------
Olmer online administrator
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Sirocco
сообщение 20.6.2017, 0:20
Сообщение #6


******

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



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

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

 

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