|
|
|
bandageself - почему не работает? |
|
|
ikorus |
3.11.2014, 14:27
|
Группа: Пользователи Наличность: 0
Пользователь №: 16.948
Возраст: 36
|
В клиенте встроенный макрос bandageself не работает. Допускаю, конечно, что я просто не разобрался, как правильно его использовать, но информации по тому, как правильно я не нашел, поэтому можно считать, что не работает. Кто-нибудь знает, как этот макрос работает? Как альтернативу я пробую написать скрипт на хил, срабатывающий от текстовой команды, но уперся в проблему: чтобы скрипт запустить, нужен даблклик по объекту (IMG: style_emoticons/default/sad.gif) Каким еще образом можно запустить скрипт, а еще лучше - каким образом можно даблклик эмулировать в скрипте?
|
|
|
|
RL_ka |
3.11.2014, 17:03
|
Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013 Группа: Модераторы Наличность: 13715 Из: Екатеринбург
Пользователь №: 16.211
|
Цитата(ikorus @ 3.11.2014, 12:27) Как альтернативу я пробую написать скрипт на хил, срабатывающий от текстовой команды, но уперся в проблему: чтобы скрипт запустить, нужен даблклик по объекту (IMG: style_emoticons/default/sad.gif) Каким еще образом можно запустить скрипт, а еще лучше - каким образом можно даблклик эмулировать в скрипте? Тебе не нужно ничего и никуда нажимать на стороне сервера для хила. тебе нужно отправить клиенту таргет, подхилить цель и сделать всё необходимое что делают обычно твои бинты, затем удалить бинт. Другими словами твоя команда хила должна быть на 99% такой же как твой скрипт бинта. Только запускаться этот скрипт будет не после использования объекта, а после ввода команды. Код use uo; program heal_me(who) хил_меня забираем бинт endprogram
и этот скрипт ты можешь запускать из команды или после даблклика на бинт. Что касается опции bandageself - нужно разбираться как она работает в клиенте. Нужно знать производит ли клиент все действия с бинтами самостоятельно, или серверу отправляется пакет с "командой" подхилить себя (в данном случае нужно будет писать хук)
|
|
|
|
ikorus |
3.11.2014, 20:46
|
Группа: Пользователи Наличность: 0
Пользователь №: 16.948
Возраст: 36
|
Вот такой скрипт успешно работает, но как видно - бинты не юзает. К сожалению, не получилось с использованием бинтов сделать - скрипт их в упор не видит в бэкпаке, хоть по одному, хоть в виде стека. Как доработать под бинты - не понимаю. И брал с перса переменную, и объявлял - не хочет видеть, и все тут. Пока выложу рабочий код сюда. Переделано из скрипта хилинга, который запускается при юзании бинтов. Позволяет и лечится, и от ядов избавляться. Там еще в зависимостях наверняка лишнее осталось - подскажите, если есть что почистить для кошерности. Код 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 if( who.poisoned ) CureSelf( who ); else HealPatient( who ); endif
endprogram
function CureSelf( who )
SendSysMessage( who, "You start to cure yourself." );
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 ) SendSysMessage( who, "Yours fingers slip..." ); CreateItemInBackpack( who, 0x0e20, 1 ); vital := AP_GetVital( who, HITS ); 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 )
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; 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 ) SendSysMessage( who, "Yours fingers slip..." ); CreateItemInBackpack( who, 0x0e20, 1 ); vital := AP_GetVital( who, HITS ); 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 Цитата(RL_ka @ 3.11.2014, 20:03) Что касается опции bandageself - нужно разбираться как она работает в клиенте. Нужно знать производит ли клиент все действия с бинтами самостоятельно, или серверу отправляется пакет с "командой" подхилить себя (в данном случае нужно будет писать хук)
Пакеты слушать - это пока для меня слишком круто ))) Предпочел воспользоваться поводом для написания скрипта
|
|
|
|
RL_ka |
3.11.2014, 21:24
|
Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013 Группа: Модераторы Наличность: 13715 Из: Екатеринбург
Пользователь №: 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, 15:17
|
Группа: Пользователи Наличность: 0
Пользователь №: 16.948
Возраст: 36
|
Цитата(RL_ka @ 4.11.2014, 0:24) Ну не удивительно. У тебя вообще ни в одном месте скрипта нет ни единого упоминания о бинтах(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
С помощью этой проверки ты во-первых устанавливаешь наличие бинтов в бекпаке, а во-вторых получаешь на них ссылeку, для дальнейшего использования в скрипте (удаления 1 штуки) Подумай сам куда это лучше всего вставить(IMG: style_emoticons/default/smile.gif) Все использованные функции стандартные, отсюда http://docs.polserver.com/pol099/index.phpКак забрать 1 бинт можешь найти по той же ссылке(IMG: style_emoticons/default/smile.gif) Скрипт воо ще читерский вышел - не только бинты не проверяются, но и занятость перса тоже. Можно вызывать хил даже во время другого хила, можно во время хайда и медитации (IMG: style_emoticons/default/biggrin.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 |
5.11.2014, 23:04
|
Группа: Пользователи Наличность: 0
Пользователь №: 16.948
Возраст: 36
|
Цитата(RL_ka @ 5.11.2014, 19:27) Код if (who.attached) SendSysMessage(who, "You are already doing something else."); return; endif
этот атрибут блокирует использование хила только, когда перс занят: во время медицации теперь лечиться нельзя, как и во время майнинга или другого действия в цикле (loop). попробовал вешать свойства объекта на чара на время хила, но не срабатывает фишка - все равно хилится, не ждет, пока закончит. Вот куски нерабочей схемы Код if( GetObjProperty( who, "#HealPatient" ) ) SendSysMessage( who, "You must wait before being able to heal yourself again." ); return 0; endif
var heal; SetObjProperty( who, "#HealPatient", heal ); ... тут хилимся ... EraseObjProperty( who, "#HealPatient" );
На самом деле attached указывает на используемый в данный момент персонажем скрипт. Если используется (скрипт "прикреплен" к персонажу), - то нельзя будет хилить. В остальных случая можно. Получается, что нужно добавить мой скрипт в число тех, которые лочат чара, и тогда все будет правильно реализовано. А остальное - костыли
|
|
|
|
pager |
6.11.2014, 6:49
|
Apprentice
Сообщений: 147
Регистрация: 10.1.2006 Группа: Пользователи Наличность: 0 Из: --
Пользователь №: 4.699
Возраст: --
|
Цитата(ikorus @ 6.11.2014, 1:04) этот атрибут блокирует использование хила только, когда перс занят:
Вот еще одно решение проблемы : Скрипт выводит сообщение( с поддержкой множество языков ) если в группе PROC_SKILL есть процессы .Пример сообщения: Подождите пока завершится : Навык лечения. Так же можно скрипту посылать событие с помощью функции MSendprocEvent например для того чтобы при смерти или выходе из игры персонажа, скрипт завершался мгновенно. Если кого заинтересовало, то MsendProcEvent и другие includes лежат в пакете spawnernpc на форуме.. Код ///////////////////////////////////////////// language.cfg Language Rus { Message_Wait_script Подождите пока завершится script_usebandage_name Навык лечения.
}
Language Enu { Message_Wait_script Wait until the end script_usebandage_name Skill healing.
}
//////////////////////////////////////
Use uo; Use os; Use unicode;
Const PROC_SKILL := “skill”;
var language_cfg := ReadConfigFile(“:*:language”);
Program usebandage(who,bandage) var lang := MGetMobileLanguage(who); if(!MGetProcDelay(who,PROC_SKILL,who,lang)) MsetProcPid(who,PROC_SKILL,”usebandage”,struct{pid := GetPid(),message := "script_usebandage_name”,level := 0}); Bandages(who,bandage,lang); MsetProcPid(who,PROC_SKILL,”usebandage”); endif endprogram //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function Bandages(byref who,byref bandage,byref lang) Код скрипта........... ... ….
endfunction
////////////////////////////////////////////////include functions /////////////////////////////////////////////////// function MGetProcDelay(object,procname,mobile,lang,level := DEFAULT_PROC_LEVEL) var prop := MGetObjProperty(object,"#procpid",dictionary); foreach name in (prop[procname].keys()) if(Cint(prop[procname][name].level) == Cint(level)) MConfigLanguageSendSysMessageUc(mobile,"message_wait_script",lang.langcode,": " + MGetElement(GetConfigString(language_cfg[lang.langcode],prop[procname][name].message),prop[procname][name].message + " - language_cfg not found."),lang.font,lang.color); return 1; endif endforeach endfunction //////////////////////////////////////////////////////////////////////////////////////////////////////////////// function MGetObjProperty(object,name,err := 0) if(name in object.propnames()) return object.getprop(name); else return err; endif endfunction //////////////////////////////////////////////////////////////////////////////////////////////////////////////// function MConfigLanguageSendSysMessageUc(who,name,langcode,text := "",fount := _DEFAULT_UCFONT,color := _DEFAULT_UCCOLOR) return SendSysMessageUc(who,CAscZ(MGetElement(GetConfigstring(language_cfg[langcode],name),name + " - language_cfg not found ") + text),langcode,fount,color); endfunction
////////////////////////////////////////////////////////////////////////////////////////////////////////////// function MGetElement(structure,err := 0) if(structure) return structure; else return err; endif endfunction
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function MSetProcPid(mobile,procname,name,structure := 0) set_critical(1); Detach(); var prop := MGetObjProperty(mobile,"#procpid",dictionary); if(!structure and !prop[procname].size() <= 1) prop.erase(procname); elseif(!structure) prop[procname].erase(name); elseif(!prop.exists(procname)) prop.insert(procname,dictionary{name -> structure}); else prop[procname].insert(name,structure); endif mobile.setprop("#procpid",prop); set_critical(0); endfunction /////////////////////////////////////////////////////////////////////////////////////////////////////////////// function MGetMobileLanguage(byref mobile) return MGetObjProperty(mobile,"language",struct{langcode := "rus",font := _DEFAULT_UCFONT,color := _DEFAULT_UCCOLOR}); endfunction
Сообщение отредактировал RL_ka - 6.11.2014, 14:52
|
|
|
|
ikorus |
6.11.2014, 22:18
|
Группа: Пользователи Наличность: 0
Пользователь №: 16.948
Возраст: 36
|
Отладил вариант с навешиванием пропертисов - все работает как требуется! Код 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 if (who.attached) SendSysMessage(who, "You are already doing something else."); return 0; endif var busy := GetObjProperty( who, "HealSelf" ); if (busy == 1) SendSysMessage(who, "Already bandage yourself."); 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 SetObjProperty( who, "HealSelf", 0 );
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." ); SetObjProperty( who, "HealSelf", 1 ); 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 ); 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." ); SetObjProperty( who, "HealSelf", 1 ); 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
С аттачем тоже хочу попробовать, но сегодня уже не буду Сообщение отредактировал RL_ka - 7.11.2014, 1:22
|
|
|
|
ikorus |
7.11.2014, 20:24
|
Группа: Пользователи Наличность: 0
Пользователь №: 16.948
Возраст: 36
|
Цитата(RL_ka @ 7.11.2014, 3:33) Слабое место: если в момент задержки, между началом хила и окончанием, чар выйдет в логаут по какой-то причине, то HealSelf на нём навсегда останется равной еденице и твой скрипт перестанет работать. В этом случае нужно обязательно прописать в logon и reconnect скрипты стирание этой проперти.
ps. В случае, если Attach удовлетворит всем твоим потребностям, то подобные "костыли" будут не нужны
на самом деле хотелось поэкспериментировать с пропертисами ))) с аттачем все работает как надо: Код 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 if (who.attached) SendSysMessage(who, "You are already doing something else."); 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 Attach(who); 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 ); 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
|
|
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|