Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

MyDC.ru _ Скрипты для RusHub'а _ Объявления (Announcements)

Автор: STRELOK 9.1.2010, 18:40

Название: Announcements
Версия хаба: RusHub 2.0.5 и выше
Версия lua плагина: 1.6 и выше
Версия скрипта: 1.1
Автор: STRELOK
Описание: Публикация объявления администрацией хаба. Выводит объявления юзеру при подключении к хабу
Возможности:

Для работы скрипта необходимо скачать модуль files http://mydc.ru/index.html?showtopic=2937&view=findpost&p=25266

 announcements.rar ( 1.5 килобайт ) : 94
 

Автор: Setuper 9.1.2010, 19:44

Код
local tUser = Core.GetUser(UID, 2047)
local sUser = Core.GetUser(UID, 8)


Первая строка уже содержит почти все биты, поэтому вторую строку незачем писать.

Цитата
2^0 - ник (sNick)
2^1 - ip (sIP)
2^2 - UID (UID)
2^3 - профиль (iProfile)
2^4 - MyINFO строка (sMyINFO)
2^5 - пользовательские данные (sData)
2^6 - пользователь в оп-лите (bInOpList)
2^7 - пользователь полностью вошёл и добавлен в список пользователей (bInUserList)
2^8 - реальный порт (iPort)
2^9 - порт коннекта (iPortConn)
2^10 - мак адрес (sMacAddress)
2^11 - версия протокола (sVersion)


В двоичной системе:
000000000001 - ник (sNick)
000000000010 - ip (sIP)
000000000100 - UID (UID)
000000001000 - профиль (iProfile)
000000010000 - MyINFO строка (sMyINFO)
000000100000 - пользовательские данные (sData)
000001000000 - пользователь в оп-лите (bInOpList)
000010000000 - пользователь полностью вошёл и добавлен в список пользователей (bInUserList)
000100000000 - реальный порт (iPort)
001000000000 - порт коннекта (iPortConn)
010000000000 - мак адрес (sMacAddress)
100000000000 - версия протокола (sVersion)

Теперь, как перейти из двоичной системы в десятичную?
Всё очень просто: отсчитываем справа позицию, на которой стоит единица и возводим двойку в эту степень (отсчёт позиции происходит с 0, а не с 1). То есть для поля ника нулевая позиция, 2^0 = 1.
Код
local tUser = Core.GetUser(UID, 1)



Для профиля: третья позиция, следовательно для профиля 2^3 = 8
Код
local tUser = Core.GetUser(UID, 8)


А что если 1 не в одном поле, а в нескольких полях?
Пример: 101010101010.
Каждая позиция отвечает за добавление какого-то поля. Вот и смотрим по позициям какие поля добавятся. Для этих полей будет число (считаем справа на лева): 0*2^0 + 1*2^1 + 0*2^2 + 1*2^3 + 0*2^4 + 1*2^5 + 0*2^6 + 1*2^7 + 0*2^8 + 1*2^9 + 0*2^10 + 1*2^11 = 2730
То есть для того, чтобы в таблицу tUser поместить поля sIP, iProfile, sData, bInUserList, iPortConn и sVersion (именно на позициях этих полей стоит 1 в нашем бинарном числе), нужно в функции написать число 2730:
Код
local tUser = Core.GetUser(UID, 2730)


Давай те теперь разберёмся чему же отвечает число 2047, которое используется в скрипте?
Оно отвечает следующей бинарной строке: 011111111111. То есть это число добавит в таблицу tUser все поля, кроме поля sVersion.


Каждому десятичному числу отвечает двоичное число. Например, мы рассматривали двоичное число 101010101010 и выяснили, что ему отвечает десятичное число 2730. А каком двоичному числу отвечает следующее десятичное число 2731? Естественно ему соответствует двоичное число 101010101011, то есть для числа 2731 в таблицу tUser добавятся теже самые поля, что и для числа 2730, но плюс ещё поле sNick.

1 = 000000000001
2 = 000000000010
3 = 000000000011
4 = 000000000100
5 = 000000000101

...

2730 = 101010101010
2731 = 101010101011
2732 = 101010101100
2733 = 101010101101
2734 = 101010101110
2735 = 101010101111

и тд.


Надеюсь, что я понятно объяснил работу с бинарными числами.
Функция Core.GetUser достаточно хорошо оптимизирует код, если правильно ею распоряжаться и вносить в таблицу tUser только те поля, которые мы собираемся использовать в данной области видимости.

У тебя в функции OnChat используется только 2 поля: поле sNick и поле iProfile, поэтому самый оптимальный код будет выглядеть так:
Код
local tUser = Core.GetUser(UID, 9)
таблица tUser будет содержать только эти 2 поля (sNick и iProfile). В функции OnUserEnter всё оптимально, и там ничего менять не нужно.



И ещё раз повторю, что не нужно к каждому скрипту делать свой модуль. Модуль должен быть один для всех скриптов, и называться он должен в соответствии с теми функциями, которые он содержит.

Автор: STRELOK 9.1.2010, 20:10

Цитата(Setuper @ 9.1.2010, 21:44) *
И ещё раз повторю, что не нужно к каждому скрипту делать свой модуль. Модуль должен быть один для всех скриптов, и называться он должен в соответствии с теми функциями, которые он содержит.

Хорошо. Напишу единый модуль для всех своих скриптов big_smile.gif

Автор: Wariner 9.1.2010, 20:20

Нет ты не совсем понял. будет несколько модулей которые использовать будут все скрипты!

Автор: Setuper 9.1.2010, 21:04

Ща все сделаем)))

Ну вот совсем другое дело))))

Автор: -=FugeN=- 2 16.6.2010, 7:11

немного кривой скрипт


пример:


вот у меня 7 объявлений, я хочу удалить допустим третье

08:04] <Hub-Security> Объявление №3 удалено!
[08:04] <Hub-Security> Объявление №3 удалено!
[08:04] <Hub-Security> Объявление №3 удалено!
[08:04] <Hub-Security> Объявление №3 удалено!

3 удаляется, а с ним ВСЕ следующие, такое уже замечал не один раз..

у всех также? или только у меня одного?

Автор: Accelerator 16.6.2010, 7:16

Да, ошибка действительно есть.

Исправил. Скрипт в первом посте, пробуйте.