|
bandageself - почему не работает? |
|
|
| ikorus |
3.11.2014, 14:27
|

 
Группа: Пользователи Наличность: 0
Пользователь №: 16.948
Возраст: 36

|
В клиенте встроенный макрос bandageself не работает. Допускаю, конечно, что я просто не разобрался, как правильно его использовать, но информации по тому, как правильно я не нашел, поэтому можно считать, что не работает. Кто-нибудь знает, как этот макрос работает? Как альтернативу я пробую написать скрипт на хил, срабатывающий от текстовой команды, но уперся в проблему: чтобы скрипт запустить, нужен даблклик по объекту (IMG: style_emoticons/default/sad.gif) Каким еще образом можно запустить скрипт, а еще лучше - каким образом можно даблклик эмулировать в скрипте?
|
|
|
|
|
|
|
  |
Ответов
| RL_ka |
3.11.2014, 21:24
|
    
Разработчик Injection
Сообщений: 474
Регистрация: 13.7.2013 Группа: Модераторы Наличность: 14979 Из: Екатеринбург
Пользователь №: 16.211

|
Ну не удивительно. У тебя вообще ни в одном месте скрипта нет ни единого упоминания о бинтах(IMG: style_emoticons/default/smile.gif) Скрипт просто хилит и создаёт грязный бинт(IMG: style_emoticons/default/smile.gif) Нужно сначала бинты найти в бекпаке. Я намеренно не буду писать тебе что и как, чтобы ты сам хоть немного "вливался" в это (IMG: style_emoticons/default/smile.gif) Простейшая проверка на наличие бинтов пишется вот так: Код var binti; foreach item in ( EnumerateItemsInContainer( who.backpack ) ) if (item.objtype == 0x0e20) // или любой другой тип бинтов binti := item; endif endforeach
if (!binti) SendSysMessage(who, "You have no bandages...."); return 0; endif
С помощью этой проверки ты во-первых устанавливаешь наличие бинтов в бекпаке, а во-вторых получаешь на них ссылку, для дальнейшего использования в скрипте (удаления 1 штуки) Подумай сам куда это лучше всего вставить(IMG: style_emoticons/default/smile.gif) Все использованные функции стандартные, отсюда http://docs.polserver.com/pol099/index.phpКак забрать 1 бинт можешь найти по той же ссылке(IMG: style_emoticons/default/smile.gif)
|
|
|
|
|
|
| ikorus |
5.11.2014, 21:58
|

 
Группа: Пользователи Наличность: 0
Пользователь №: 16.948
Возраст: 36

|
Цитата(RL_ka @ 4.11.2014, 0:24)  Простейшая проверка на наличие бинтов пишется вот так: Код var binti; foreach item in ( EnumerateItemsInContainer( who.backpack ) ) if (item.objtype == 0x0e20) // или любой другой тип бинтов binti := item; endif endforeach
if (!binti) SendSysMessage(who, "You have no bandages...."); return 0; endif
мне не пришлось долго мучатся, git - штука удобная, а упоминания о бинтах я удалил сам, потому что не мог их найти в бэкпаке. В общем, восстановил исходные данные, добавил поиск бинтов и все ок стало: Код use uo; use os; use util; use math;
include "include/itemUtil"; include ":attributes:attributes"; include ":classes:classes"; include ":death:resurrection"; include ":equipment:protections"; include ":timedscripts:timedScripts";
program textcmd_BandageSelf( who )
if( who.dead ) return 0; endif
var bandage; foreach item in ( EnumerateItemsInContainer( who.backpack ) ) if (item.objtype == 0xEE9) bandage := item; endif endforeach
if (!bandage) SendSysMessage(who, "You have no bandages...."); return 0; endif if( who.poisoned ) CureSelf( who, bandage ); else HealPatient( who, bandage ); endif
endprogram
function CureSelf( who, bandage )
if( !SubtractAmount( bandage, 2 )) SendSysMessage( who, "You don't have enough bandages." ); return 0; else SendSysMessage( who, "You start to cure yourself." ); endif
var vital := AP_GetVital( who, HITS ), delay := 10; while( Cint( delay )) Sleep( 1 ); delay -= 1; if( who.dead || !who.poisoned ) SendSysMessage( who, "You have lost your concentration." ); return 0; elseif( AP_GetVital( who, HITS ) < vital ) if( !SubtractAmount( bandage, 2 )) SendSysMessage( who, "You don't have enough bandages." ); SendSysMessage( who, "You couldn't cure yourself." ); return 0; else SendSysMessage( who, "Yours fingers slip..." ); CreateItemInBackpack( who, 0x0e20, 1 ); vital := AP_GetVital( who, HITS ); endif endif endwhile var current_poison := CInt( GetObjProperty( who, "#PoisonedLevel" )); if( !current_poison ) SendSysMessage( who, "That is not poisoned." ); return 0; endif var bonus := CInt( GetMobileProtection( who, "HealingIncrease" )); if( bonus ) bonus := CInt( bonus * 5 ); endif var difficulty := CInt(( current_poison * 25 ) + 15 ), healing := AP_GetSkill( who, HEALING );
if( SkillCheck( who, HEALING, CInt( difficulty )) > 0 || healing >= CInt( difficulty - bonus ))
SendSysMessage( who, "You cured level "+current_poison+" poison." ); TS_LowerDuration( who, "DefaultPoison", -1 ); if( who.serial != who.serial ) var heal := CInt( HL_GetAmount( who ) * 0.25 ); SendSysMessage( who, "You heal "+heal+" damages." ); HealDamage( who, heal ); endif else SendSysMessage( who, "You couldn't cure yourself!" ); endif CreateItemInBackpack( who, 0x0e20, 2 );
return 1; endfunction
function HealPatient( who, bandage )
var max_vital := AP_GetStat( who, STRENGTH ), vital := AP_GetVital( who, HITS ); if( CInt( vital ) >= CInt( max_vital )) SendSysMessage( who, "This patient don't have a bruise!" ); return 0; elseif( !SubtractAmount( bandage, 1 )) SendSysMessage( who, "You don't have enough bandages." ); return 0; else SendSysMessage( who, "You start to heal yourself." ); endif var delay := 7; while( Cint( delay )) Sleep( 1 ); delay -= 1; if( CInt( vital ) >= CInt( max_vital )) SendSysMessage( who, "This patient don't have a bruise!" ); return 0; elseif( AP_GetVital( who, HITS ) < vital ) if( !SubtractAmount( bandage, 1 )) SendSysMessage( who, "You don't have enough bandages." ); SendSysMessage( who, "You couldn't heal yourself." ); return 0; else SendSysMessage( who, "Yours fingers slip..." ); CreateItemInBackpack( who, 0x0e20, 1 ); vital := AP_GetVital( who, HITS ); endif endif endwhile var difficulty := CInt( AP_GetStat( who, STRENGTH ) - AP_GetVital( who, HITS )); if( difficulty > 65 ) difficulty := 65; endif
if( SkillCheck( who, HEALING, difficulty ) > 0 ) var heal := HL_GetAmount( who ); SendSysMessage( who, "You heal "+heal+" damages." ); HealDamage( who, heal ); else SendSysMessage( who, "You couldn't heal yourself." ); endif CreateItemInBackpack( who, 0x0e20, 1 ); return 1; endfunction
function HL_GetAmount( who )
var heal_skill := CInt( AP_GetSkill( who, HEALING ) / 10 ); var anat_skill := CInt( AP_GetSkill( who, ANATOMY ) / 15 );
var heal := RandomDiceRoll( CInt( heal_skill )+"d4+"+CInt( heal_skill )) + RandomDiceRoll( "1d8+2" ) + CInt( anat_skill );
var bonus := CInt( GetMobileProtection( who, "HealingIncrease" )); if( bonus ) heal *= CDbl(( bonus * 0.1 ) + 1 ); endif
if( GetObjProperty( who, WARRIOR )) heal *= ClasseBonus( who, WARRIOR ); endif return CInt( heal ); endfunction
|
|
|
|
|
|
Сообщений в этой теме
ikorus bandageself - почему не работает? 3.11.2014, 14:27 Juzzver для работы макрос команды bandageself нужно создат... 3.11.2014, 14:37 ikorus
для работы макрос команды bandageself нужно созда... 3.11.2014, 16:54 RL_ka
Как альтернативу я пробую написать скрипт на хил,... 3.11.2014, 17:03 ikorus Вот такой скрипт успешно работает, но как видно - ... 3.11.2014, 20:46 ikorus
Ну не удивительно.
У тебя вообще ни в одном месте... 5.11.2014, 15:17 RL_ka Ну... тебе всё-таки придётся начать погружаться в ... 5.11.2014, 16:27 ikorus
[code]
if (who.attached)
SendSysMessage... 5.11.2014, 23:04  pager
этот атрибут блокирует использование хила только,... 6.11.2014, 6:49 RL_ka Ну тогда остаётся последний вариант фикса "из... 6.11.2014, 2:25 ikorus Отладил вариант с навешиванием пропертисов - все р... 6.11.2014, 22:18 RL_ka Слабое место: если в момент задержки, между начало... 7.11.2014, 0:33 ikorus
Слабое место: если в момент задержки, между начал... 7.11.2014, 20:24 RL_ka Молодец, быстро учишься :)
Следующая твоя задача,... 7.11.2014, 22:58 PolDev
А что за два скрипта? А то я не уловил )) 12.11.2014, 21:44 RL_ka
А что за два скрипта? А то я не уловил ))
обычн... 13.11.2014, 12:05
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|