Перейти к содержимому


Фотография

[1.7.10] ComputerCraft [1.74]


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 2863

#2441 Lexor

Lexor

    Добытчик угля

  • Пользователи
  • Сообщений: 399
  • Откуда: Иркутская область

Написал 19.08.2013 - 09:33

Лично я через пулл-эвент никогда не принимал входящий сигнал, а использовал Redstone (API). Понял почему не работает код: пулл-эвент "редстоун" срабатывает не только при подаче сигнала, а вообще при любом изменении. Т.е по сути то код работает, только не совсем как надо: подал сигнал пулл-эвент сработал, снял сигнал - он снова сработал. Вот код с учетом того, чтобы черепаха реагировала только на подачу сигнала, а его исчезновение игнорировала.
Скрытый текст


#2442 Ark

Ark

    Странник

  • Пользователи
  • Сообщений: 51

Написал 19.08.2013 - 10:25

Вообщем то вроде работает. Просто я не понял как через Redstone (API) делать, поэтому начал через pullEvent [snowman]

#2443 Lexor

Lexor

    Добытчик угля

  • Пользователи
  • Сообщений: 399
  • Откуда: Иркутская область

Написал 19.08.2013 - 10:35

Просто я не понял как через Redstone (API) делать, поэтому начал через pullEvent [snowman]


#2444 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 19.08.2013 - 10:57

while true do    os[paste][/paste]pullEvent("redstone") --вкл    rs[paste][/paste]setOutput("front", not rs[paste][/paste]getOutput("front")) --инвертируем    os[paste][/paste]pullEvent("redstone") --выклend


#2445 Dimus

Dimus

    Странник

  • Пользователи
  • Сообщений: 89

Написал 19.08.2013 - 11:23

Думаю, лучше не считать количество изменений, а ловить фронт. Потому, что если программа будет запущена при активном сигнале на входе, то она будет работать немного по другому. Можно сделать, например, так
while true doos[paste][/paste]pullEvent("redstone")if rs[paste][/paste]getInput("back") then  -- если на входе активный уровень   rs[paste][/paste]setOutput("front",not rs[paste][/paste]getInput("front"))  -- инвертируем выходendend


#2446 Lexor

Lexor

    Добытчик угля

  • Пользователи
  • Сообщений: 399
  • Откуда: Иркутская область

Написал 19.08.2013 - 11:58

Apokalypsys, отличное решение, просто, как и все гениальное. Dimus, если известна сторона входа, то пулл-евент вообще не нужен.

#2447 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 19.08.2013 - 12:51

rs[paste][/paste]setOutput("front",not rs[paste][/paste]getInput("front"))
Dimus, rs.getInput возвращает состояние входа. Нужен rs.getOutput. Lexor, os.pullEvent конкретно в коде Dimus'а, чтобы регистрировать моргания, а то получиться клок-генератор при включеном редстоне.

#2448 Dimus

Dimus

    Странник

  • Пользователи
  • Сообщений: 89

Написал 19.08.2013 - 13:15

Dimus, rs.getInput возвращает состояние входа. Нужен rs.getOutput.

Верно. А os.pullEvent("redstone") случайно не возвращает сторону и значение сигнала?

#2449 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 19.08.2013 - 13:25

Нет, его суть в том, чтобы остановить программу до изменения сигнала редстоуна. Состояние сигнала нужно проверять.Добавил API "redstone".

#2450 Dimus

Dimus

    Странник

  • Пользователи
  • Сообщений: 89

Написал 19.08.2013 - 14:17

Значит мне в bit.blshift передалось число 8589924203, только из-за моего косяка, который я потом исправил, но продолжал делать битовые функции. Отлично, зато теперь алгоритм что надо.
Надо в пользовательские проекты добавить. Вещь в хозяйстве нужная.

Возможно не только из-за косяка. Сложение может дать перенос в 32-й разряд.
К стати, куда то делась функция bit.add (выдает ошибку md5:62: attempt to call nil)
Предлагаю для рассмотрения такой вариант
local function add([paste][/paste][paste][/paste][paste][/paste])   local z = 0   for i,v in pairs({[paste][/paste][paste][/paste][paste][/paste]}) do     z = z + v     if z>=4294967296 then z=z-4294967296 end   end   return zendlocal function rol(number, count)   return bit[paste][/paste]bor(bit[paste][/paste]blshift(number, count), bit[paste][/paste]blogic_rshift(number, (32 - count)))endlocal function X(a, b, c, x, s, t)   return add( rol(add(b, a, x, t), s), c)end


#2451 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 19.08.2013 - 22:30

Не нужно добавлять итератор, тем более pairs. Он для массивов с индексами-ключами, можно было бы обойтись и ipairs. Но я всё равно хочу сделать максимально возможною скорость.
local function add(x, y)   return x + y > 4294967296 and x + y - 4294967296 or x + y   -- x + y > 4294967296 ? x + y -4294967296 : x + iend

#2452 Dimus

Dimus

    Странник

  • Пользователи
  • Сообщений: 89

Написал 20.08.2013 - 16:46

Можно ли заблокировать возможность перегрузки компьютера по Ctrl+R ?

#2453 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 20.08.2013 - 16:51

Нет, он выключит комп быстрее, чем ты его словишь os.pullEventRaw.

#2454 Vitduo

Vitduo

    Добытчик дерева

  • Пользователи
  • Сообщений: 168
  • Откуда: Город Черепашкино

Написал 20.08.2013 - 19:26

Как использовать станцию снабжения со снабженой модулем снабжения черепашкой? Код в студию! И да, ребята, когда пилили вирус, умудрились игнорировать Ctrl+T и Ctrl+R, если не ошибаюсь(см. значительно выше)
Добра вам!
)=/

#2455 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 20.08.2013 - 19:57

Вирус наверное был такой?
os[paste][/paste]pullEvent = os[paste][/paste]pullEventRawprint("HAHAHA")while true do   sleep(1)end
От ребута ничего не спасает.

#2456 Vitduo

Vitduo

    Добытчик дерева

  • Пользователи
  • Сообщений: 168
  • Откуда: Город Черепашкино

Написал 20.08.2013 - 20:05

Редактирование кода, залезая в сейвы/КомпуторКрафт. А на первый вопрос, я так понял, никто не ответит? У меня с английским все плохо
Добра вам!
)=/

#2457 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 20.08.2013 - 20:52

Редактирование кода, залезая в сейвы/КомпуторКрафт

Каждый компьютер - это поток, события поступают в комп с помощью coroutine.yield( filter ), вызванной из главной нити компа. Java запускает нить, передавая аргументами событие. (поэтому coroutine.resume генерирует события внутри дочерней нити). Но если по Ctrl+T в компьютер выбрасывается событие "terminate", то по Ctrl+S или по Ctrl+R java обрабатывает их внутри и события не выбрасывает. (а зачем? поток уже остановлен, событие выбросится при его запуске). Я снабжением не пользовался, не знаю. В описании написанно: link() - соеденяет черепаху со станцие спереди. true - удачно, false - нет. resupply(slot) - заполняет стак предметов в слоте slot, должен быть хоть 1 предмет. true - удачно, false - нет. getError() - если функции выше вернули false, эта вернет ошибку с описанием в виде строки.

#2458 Lexor

Lexor

    Добытчик угля

  • Пользователи
  • Сообщений: 399
  • Откуда: Иркутская область

Написал 21.08.2013 - 02:12

Скрытый текст

Не совсем так. Можно написать вредоносную программку, которая неплохо будет защищена от ребута. Т.е по сути то комп будет перезагружаться, но это ничего не даст. Принцип такой: название программы разумеется startup, кроме того она перехватывает попытку завершить сочетанием ctrl+t и отслеживает пулл-эвент вставки дискеты (у дисковода ведь больший приоритет и стартап при перезагрузке компа сперва грузится оттуда) при обнаружении таковой копирует туда свою копию, удаляя оттуда другой стартап. Ну и label присваивает компу, чтобы при его физическом демонтаже сохраниться. Способов победить такую программу средствами minecraft/CC я не знаю. Только физическое удаление ее средствами винды из папки сейвов.

Как использовать станцию снабжения со снабженой модулем снабжения черепашкой?

У DW20 где-то был старый обзор на тему мискперифералс, поищи, он подробно рассказывал и наглядно показывал, большого знания английского не нужно. А вообще я лично никогда не пользовался станцией снабжения - эндерсундук рулит :)

#2459 Apokalypsys

Apokalypsys

    Добытчик дерева

  • Пользователи
  • Сообщений: 183

Написал 21.08.2013 - 10:14

Способов победить такую программу средствами minecraft/CC я не знаю.

1. Ctrl+S. Чтобы он не увидел свою смерть в виде дискеты. 2. Ставим дисковод. 3. Вставляем дискету с файлом "startup" любого содержания. 4. ПКМ на компе. 5. Удаляем вирус. Есть еще непобедимые вирусы?

#2460 Lexor

Lexor

    Добытчик угля

  • Пользователи
  • Сообщений: 399
  • Откуда: Иркутская область

Написал 21.08.2013 - 10:37

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


Количество пользователей, читающих эту тему: 3

0 пользователей, 2 гостей, 0 анонимных


    Bing