| 
| infermik | Дата: Среда, 23 Марта 2011, 22:30 | Сообщение # 1 |  |   заслуженный участник Сейчас нет на сайте | Всем привет, сейчас я покажу как сделать скилы (Алхимия, кузнец, и вся прочая абра-кадабра) Возможно скрипт вызовет у вас массу затруднений, но он легкий.
 Скил-скрипт написан для Eclipse Stable
  Скил немного реальный т.е вам придется отдохнуть чтобы опять приступить к работе   Итак пожалуй начнем:   1)Открываем main.ess и в самый конец вставляем:
 
 Code '******************************** Function F_Freeslots(index)
 '********************************
 
 Dim slot
 Dim count
 
 slot=1
 count=0
 Do While slot < 25
 If getplayerinvitemnum(index, slot) = 0 Then
 count = Int(count) + 1
 End If
 slot=Int(slot) + 1
 Loop
 F_Freeslots=Int(count)
 End Function
 
 '********************************
 Sub Give_Item(index, number, durability)
 '********************************
 
 Dim slot
 
 slot = 1
 Do While slot < 25
 If Getplayerinvitemnum( index, Int( slot ) ) = 0 Then
 Call SetPlayerInvItemNum(index, Int( slot ), Int( number ) )
 Call SetPlayerInvItemDur(index, Int( slot ), Int( durability ) )
 Call SetPlayerInvItemValue(index, Int( slot ), Int(0) )
 Call SendInventoryUpdate(index, Int(slot) )
 slot = 25
 End If
 slot = slot + 1
 Loop
 End Sub
 
 '********************************
 Sub Give_Currency(index, number, quantity)
 '********************************
 
 Dim slot
 Dim initial
 Dim final
 Dim given
 
 slot=1
 given=0
 
 Do While slot < 25
 If Getplayerinvitemnum(index,Int(slot))=Int(number) Then
 initial = Getplayerinvitemvalue( index, Int( slot ) )
 final = Int( initial ) + Int( quantity )
 Call setplayerinvitemvalue( index, Int( slot ), Int( final ) )
 Call SendInventoryUpdate(index, Int(slot) )
 slot = 25
 given = 1
 End If
 slot = slot + 1
 Loop
 
 If given=1 Then
 slot=25
 Else
 slot=1
 End If
 
 Do While slot < 25
 If Getplayerinvitemnum(index,Int(slot)) = 0 Then
 Call SetPlayerInvItemNum(index, Int( slot ), Int( number ) )
 Call SetPlayerInvItemValue(index, Int( slot ), Int( quantity ) )
 Call SetPlayerInvItemDur(index, Int( slot ), 0 )
 Call SendInventoryUpdate(index, Int(slot) )
 slot = 25
 End If
 slot = slot + 1
 Loop
 
 End Sub
 
 '********************************
 Function F_Check_Take(index, number, value)
 '********************************
 
 Dim slot
 
 slot = 1
 F_Check_Take =0
 Do While slot < 25
 If Getplayerinvitemnum( index, Int( slot ) ) = Int( number ) Then
 If GetPlayerInvItemValue(index, Int( slot ) ) >= Int(value) Then
 F_Check_Take=1
 End If
 End If
 slot = slot + 1
 Loop
 End Function
 
 '********************************
 Sub Take_Item(index, number, value)
 '********************************
 
 Dim slot
 Dim taken
 Dim initial
 Dim final
 
 slot=1
 taken=0
 Do While Int(slot) < 25
 If Int(taken)=0 Then
 If Getplayerinvitemnum(index,Int(slot)) = Int(number) Then
 If Int(getplayerinvitemvalue(index, Int(slot))) >= Int(value) Then
 initial = Int(getplayerinvitemvalue(index, Int(slot) ) )
 final = Int(initial) - Int(value)
 If Int(final) <= 0 Then
 Call setplayerinvitemnum(index, Int(slot), Int(0) )
 Call setplayerinvitemvalue(index, Int(slot), Int(0) )
 Call setplayerinvitemdur(index, Int(slot), Int(0) )
 Call SendInventoryUpdate(index, Int(slot))
 taken=1
 Else
 Call setplayerinvitemvalue(index, Int(slot), Int(final) )
 Call SendInventoryUpdate(index, Int(slot) )
 taken=1
 End If
 End If
 End If
 End If
 slot = slot + 1
 Loop
 End Sub
 
 '********************************
 Sub Baron_Stam_regain(index)
 '********************************
 
 Dim skill_type
 Dim skill_action
 Dim stam_total
 Dim player_lvl
 
 skill_type=Trim( GetVar("scripts\mapextras\" & GetPlayerMap(index) & ".ini", "SKILL","type") )
 
 If Int(Getvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type), "has_data") ) < 1 Then
 Call putvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "Exp", Int(0) )
 Call putvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "level", Int(0))
 Call putvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "stamina", Int(10))
 Call putvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "has_data", Int(1))
 Call battlemsg(index, "You should return here if you wish to rest", 14, 1)
 End If
 
 player_lvl=Getvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "level")
 skill_action=Trim(GetVar("scripts\skills\" & skill_type & ".ini", "INDEX","action"))
 stam_total=5 + Int(player_lvl)
 Call PutVar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "stamina", Int(stam_total))
 Call battlemsg(index, "You feel refreshed and ready to " & skill_action & " again.", 14, 1)
 End Sub
 
 '********************************
 Sub Baron_Uber_skills(index)
 '********************************
 'Do not modify this script in any way.
 'It is provided as is in all goodwill.
 'There is CONSIDERABLE time spent here.
 On Error Resume next
 Dim skill_type
 Dim skill_number
 Dim take_total
 Dim give_total
 Dim count
 Dim take_count
 Dim take_num
 Dim take_val
 Dim take_msg
 Dim empty_space
 Dim take_check
 Dim needed_item
 Dim player_weapon
 Dim skill_action
 Dim currency_check
 Dim recipe_count
 Dim recipe_total
 Dim min_lvl
 Dim player_lvl
 Dim player_stam
 Dim recipe_stam
 Dim give_val
 Dim give_num
 Dim give_dur
 Dim give_msg
 Dim high_randomiser
 Dim success_chance
 Dim low_chance
 Dim high_chance
 Dim give_exp
 Dim new_exp
 Dim lvl_exp
 Dim next_lvl
 
 If Int(GetVar("scripts\mapextras\" & GetPlayerMap(index) & ".ini", "SKILL","has_data")) < 0 Then
 Call Putvar("scripts\mapextras\" & GetPlayerMap(index) & ".ini", "SKILL","type", "")
 Call Putvar("scripts\mapextras\" & GetPlayerMap(index) & ".ini", "SKILL","number", 0)
 Call Putvar("scripts\mapextras\" & GetPlayerMap(index) & ".ini", "SKILL","has_data", 1)
 Call Playermsg(index, "Made skill template for map", 14)
 Call Playermsg(index, "Credits go to Baron - http://barony.deviantart.com/", 14)
 End If
 
 RECIPE_COUNT = Int(1)
 skill_type=Trim( GetVar("scripts\mapextras\" & GetPlayerMap(index) & ".ini", "SKILL","type") )
 recipe_total=Int(GetVar("scripts\skills\" & skill_type & ".ini","INDEX" ,"total_recipes"))
 
 'RECIPES ALWAYS HAVE SKILL 1 SELECTED IN MAPEXTRAS AND TOTAL RECIPES IN SKILLS SET TO HIGHEST
 'NON RECIPES HAVE ANY SKILL SELECTED IN MAPEXTRAS AND TOTAL RECIPES IN SKILLS SET TO 1
 
 Do While Int(RECIPE_COUNT) <= Int(recipe_total)
 
 If trim(skill_type) <> "" Then
 
 skill_number = Int(GetVar("scripts\mapextras\" & GetPlayerMap(index) & ".ini", "SKILL","number"))
 
 If Int(recipe_count) > 1 Then
 skill_number = Int(recipe_count)
 End If
 
 needed_item=Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number),"item_num_needed"))
 player_weapon=Int( Getplayerinvitemnum(index, Int(getplayerweaponslot(index)) ) )
 skill_action=Trim(GetVar("scripts\skills\" & skill_type & ".ini", "INDEX","action"))
 
 If Int(needed_item) = Int(player_weapon) Then
 
 min_lvl = Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number),"min_level"))
 
 If Int(Getvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type), "has_data") ) < 1 Then
 Call putvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "Exp", Int(0) )
 Call putvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "level", Int(0))
 Call putvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "stamina", Int(10))
 Call putvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "has_data", Int(1))
 Call playermsg(index, "You attempt to " & skill_action & " for the first time!", 14)
 End If
 
 player_lvl = Int(Getvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "level"))
 
 If Int(min_lvl) <= Int(player_lvl) Then
 
 player_stam=Int(getvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "stamina"))
 recipe_stam=Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number),"stam_taken"))
 
 If Int(player_stam) >= Int(recipe_stam) Then
 
 take_total = Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number),"take_total"))
 give_total = Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number),"give_total"))
 count = Int ( 1 )
 take_count = Int ( 0 )
 empty_space=F_Freeslots(index)
 
 If Int(give_total) <= Int(empty_space) Then
 
 Do While count <= Int(take_total)
 take_num=Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number), Int(count) & "_take_num"))
 take_val=Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number), Int(count) & "_take_val"))
 
 take_check=F_Check_Take(index,take_num,take_val)
 take_count=take_count + Int(take_check)
 count=count+1
 Loop
 
 If Int(take_count) = Int(take_total) Then
 
 count = Int ( 1 )
 
 Do While Int(count) <= Int(take_total)
 take_num=Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number), Int(count) & "_take_num"))
 take_val=Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number), Int(count) & "_take_val"))
 take_msg=Trim(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number), Int(count) & "_take_Msg"))
 Call battlemsg(index, trim(take_msg), 15, 1)
 Call Take_Item(index, Int(take_num), Int(take_val) )
 count=count+1
 Loop
 
 count = Int ( 1 )
 new_exp = 0
 
 Do While Int(count) <= Int(give_total)
 give_val = Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number), Int(count) & "_give_val"))
 give_msg = Trim(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number), Int(count) & "_give_msg"))
 
 success_chance = Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number), Int(count) & "_base_chance"))
 low_chance= Int(player_lvl) - Int(min_lvl) + 1
 high_chance = Int(player_lvl) - Int(min_lvl) + Int(success_chance)
 high_randomiser = Int((high_chance + 1) * Rnd)
 
 If Int(high_randomiser) <= Int(low_chance) Then
 
 If Int(give_val) > 0 Then
 give_num = Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number), Int(count) & "_give_num"))
 Call Give_Currency(index, Int(give_num), Int(give_val) )
 Call battlemsg(index, Trim(give_msg),10, 1)
 'TO HAVE THE SCRIPT AUTO CREATE ALL ITEMS IT CAN ONCE EACH, REMOVE LINE BELOW
 RECIPE_COUNT= Int(recipe_total)
 Else
 give_num = Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number), Int(count) & "_give_num"))
 give_dur = Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number), Int(count) & "_give_dur"))
 Call Give_Item(index, give_num, give_dur)
 Call battlemsg(index, Trim(give_msg),10, 1)
 'TO HAVE THE SCRIPT AUTO CREATE ALL ITEMS IT CAN ONCE EACH, REMOVE LINE BELOW
 RECIPE_COUNT= Int(recipe_total)
 End If
 
 give_exp = 0 + Int(GetVar("scripts\skills\" & skill_type & ".ini", Int(skill_number), Int(count) & "_EXP"))
 new_exp = 0 + Int(getvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "exp")) + Int(give_exp)
 Call putvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "exp", Int(new_exp))
 End If
 
 If new_exp=0 Then
 new_exp=Int(getvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "exp"))
 End If
 
 count=count+1
 Loop
 
 next_level = Int(player_lvl) + Int(1)
 lvl_exp = Int(Getvar("experience.ini", "EXPERIENCE", "Exp" & Int(next_level) ) )
 Call battlemsg(index,new_exp & " / " & lvl_exp & " For " & next_level & " " & trim(skill_type), 6, 0)
 
 If Int(new_exp) >= Int(lvl_exp) and Int(player_lvl) < 100 Then
 new_exp= 0 + Int(new_exp) - Int(lvl_exp)
 Call putvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "exp", Int(new_exp))
 Call putvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "level", Int(next_level))
 Call battlemsg(index, "Congratulations, you are now level " & Int(next_level) & " in " & trim(skill_type) & "!", 13, 1)
 End If
 
 player_stam = Int(player_stam) - Int(recipe_stam)
 Call putvar("scripts\charextras\" & GetPlayerName(index) & ".ini", Trim(Skill_type) , "stamina", Int(player_stam))
 
 If Int(recipe_total) = 1 Then
 RECIPE_COUNT= Int(recipe_total)
 End If
 
 Else
 If Int(recipe_count) + 1 > Int(recipe_total) and Int(recipe_total) > Int(1) Then
 Call battlemsg(index, "You have no components to " & skill_action, 12, 1)
 End If
 End If
 
 Else
 Call battlemsg(index, "You need more inventory room to continue " & skill_type & ".", 15, 1)
 End If
 
 Else
 Call battlemsg(index, "You are too tired to " & skill_action & ".", 12, 1)
 End If
 
 Else
 Call battlemsg(index, "You need to be more skilled to " & skill_action & " here.", 12, 1)
 End If
 
 End If
 'This continues off end of item script. Used when empty slot. Elseif errors usually.
 If Int(needed_item) <> Int(player_weapon) and Int(recipe_count) = 1 Then
 Call battlemsg(index, "You need to get the right tool to " & skill_action & " here.", 15, 1)
 End If
 
 Else
 'Not working. Cant figure out why. Is non essential for the script to work.
 Call Playermsg(index, "You still need to define a skill for this map", 14)
 End If
 
 RECIPE_COUNT = Int(recipe_count)+1
 
 Loop
 
 End Sub
Добавлено (23.03.2011, 22:30)---------------------------------------------
 2)Далее переходим в папку Events там ищем SriptedTile.ess
  туда вставляем: 
 Code  Case 0
 Call Baron_Uber_skills(index) 'Тайл наступая на который первый раз генерируется информация о скиле который будет находится на данной карте
 
 '<><><><><>
 
 Case 1
 Call Baron_Stam_regain(index) 'Тайл наступая на который ваша энергия будет востонавливаться
 
 3)В папке Script создаем папку SKILLS и mapextras Затем в папке SKILL, в качестве примера создадим файл Mining.ini с содержимым:
 
 Code  [INDEX]
 Action=Mine 'Пишет когда вы копаете Пример: Идет добыча
 Skill=Mining 'Само название скила
 Succeeded=Mined 'Пишет если действие сделано Например: добыча завершена
 Recipe=0
 Total_recipes=1 'Странный параметр если попробовать увеличить то он будет проверять все рецепты(которые добываются) мой совет лучше его не трогать
 
 [1]
 Min_Level=0 'Требующийся уровень игрока
 Item_Num_Needed=5 'Какое орудие труда нужно для добычи
 Stam_Taken=1 'Сколько энергии заберет использование скила
 
 Take_Total=0 'Параметр который забирает предмет если не хотите чтобы при добыче гора съела кирку то оставьте на 0
 
 Give_total=2
 
 1_Give_Num=51 'Номер предмета который вы хотите дать
 1_Give_Val=0
 1_Give_dur=0
 1_Base_Chance=10 'Базовый шанс
 1_Give_Msg=You mined some copper ore. 'Сообщение о том что вы добыли
 1_EXP=15 'Сколько опыта дается за такую успешную добычу
 
 2_Give_Num=24
 2_Give_Val=1
 2_Give_dur=0
 2_Base_Chance=20
 2_Give_Msg=You break apart a crystal in your mining efforts.
 2_EXP=25
 
 [2]
 Min_Level=5
 Item_Num_Needed=5
 Stam_Taken=1
 
 Take_Total=0
 
 Give_total=2
 
 1_Give_Num=52
 1_Give_Val=0
 1_Give_dur=0
 1_Base_Chance=1 0
 1_Give_Msg=You mined some iron ore.
 1_EXP=35
 
 2_Give_Num=24
 2_Give_Val=2
 2_Give_dur=0
 2_Base_Chance=20
 2_Give_Msg=You break apart a crystal in your mining efforts.
 2_EXP=25
 
 4)Как сделать чтобы все работало? На карте ставим Скрипт-Тайл
 № 0 - Скилл
 % 1 - Отдыхаем
  Ставим на карту №0 Ну и где нибудь рядом скрипт №1 Сохраняем идем на скрипт №0 затем идем в папку Script>mapextras
 Там должен появится файл "Номер карты.ini"
 Заходим в него видим:
 
 Code [SKILL] type=
 number=0
 has_data=1
Если нет такого в файле то вставляем код, что выше.
  Итак редактируем его нам допустим надо тот самый скрипт который мы с вами разбирали И отредактируем его так:
 
 Code [SKILL] type=Mining
 number=1
 has_data=1
 Вот и все, желаю вам удачи в создании своих скилов. 
 Выпрямляю путем кнута и пряника
 
   |  |  |  |  |