Advertisement
V10

rename_mate.vbs

V10
Jul 6th, 2023 (edited)
1,899
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VBScript 5.19 KB | Gaming | 0 0
  1. ' Скрипт для переименования напарника в сейвах игры Сталкер Беларусь (by V10)
  2. ' Сохраните этот скрипт в папку с игрой под именем rename_mate.vbs и запустите
  3. ' ===================================================================================
  4. ' Настройки
  5. ' Папка с сейвами
  6. strSavesFolder = "_user_dedicated_\savedgames"
  7.  
  8. ' ===================================================================================
  9. ' Код
  10.  
  11. ' Предупреждение
  12. strWarning = "" _
  13. & "Внимание! Это не официальный скрипт! На всякий случай скопируйте вашу папку user_dedicated куда нибудь для восстановления если понадобится!" & vbNewLine _
  14. & "============================================" & vbNewLine _
  15. & "Скрипт меняет имя игрока ТОЛЬКО в сейве сервера! Для возможности смены напарника на ходу."  & vbNewLine _
  16. & "Если вы хотите изменить свой собственный никнейм вам нужно дополнительно отредактировать файл " & CreateObject("WScript.Shell").ExpandEnvironmentStrings("%USERPROFILE%") & "\sblauncher.json" & vbNewLine _
  17. & "============================================" & vbNewLine _
  18. & vbNewLine _
  19. & "Скрипт по очереди спросит про каждого игрока которого найдет на сервере." & vbNewLine _
  20. & "Продолжить?" & vbNewLine
  21. If MsgBox(sc(strWarning), vbOKCancel or vbDefaultButton2, sc("Stalker Belarus Смена имени")) = vbCancel Then WScript.Quit
  22.  
  23. ' Получаем список игроков
  24. Set oFSO = CreateObject("Scripting.FileSystemObject")
  25. For Each oFile in oFSO.GetFolder(strSavesFolder).Files
  26.     If InStr(oFile.Name,"mp_actor_") > 0 and InStr(oFile.Name,"backup") = 0 and InStr(oFile.Name,".bak") = 0 Then
  27.     ' Получаем имя игрока и предлагаем сменить ему никнейм
  28.     strActorName = Replace(oFile.Name, "mp_actor_", "")
  29.     If MsgBox(sc("Хотите переименовать игрока '") & strActorName & "' ?", vbYesNo or vbDefaultButton2, sc("Stalker Belarus Смена имени")) = vbYes Then
  30.        strNewName = InputBox(sc("Введите новый никнейм"), sc("Stalker Belarus Смена имени"), strActorName)
  31.        ' Если имя не ввели или оно не изменилось - завершаем скрипт
  32.        If strNewName = "" or strNewName = strActorName Then Exit For
  33.  
  34.        ' Читаем сейв игрока
  35.        With oFile.OpenAsTextStream()
  36.             strBinary = .Read(oFile.Size)
  37.             .Close
  38.        End With
  39.  
  40.        ' Проверяем возможность записи в новый файл
  41.        strOutFilename = oFile.ParentFolder & "\mp_actor_" & strNewName
  42.        Set oOutFile = oFSO.createTextFile(strOutFilename)
  43.        If Err.number <> 0 Then MsgBox(Err.message) : Exit For
  44.        On Error GoTo 0
  45.        Set oOutFile = Nothing
  46.  
  47.        ' Формируем новый заголовок для сейва
  48.        intOldLen = BinaryToDecimal(s2h(Left(strBinary, 2)))
  49.        intNewLen = intOldLen - (Len(strActorName) - Len(strNewName))
  50.        strNewBinary = h2s(DecimalToBinary(intNewLen)) & Right(Left(strBinary,5), 3) & strNewName & Right(strBinary, Len(strBinary) - 5 - Len(strActorName))
  51.  
  52.        ' Сохраняем новый сейв
  53.       With oFSO.createTextFile(strOutFilename)
  54.             .Write(strNewBinary)
  55.             .Close
  56.        End With
  57.    
  58.        ' Бекапим старый сейв
  59.        oFSO.MoveFile oFile.Path, oFile.Path & ".bak"
  60.  
  61.        ' Завершаем скрипт
  62.        Exit For
  63.     End If
  64.     End if
  65. Next
  66.  
  67. ' Функция перекодировки текста из utf-8 (pastebin) в win1251 (windows)
  68. Function sc(s)
  69.     adReadAll = -1
  70.     adTypeText = 2
  71.     Set objStream = CreateObject("ADODB.Stream")    
  72.     objStream.Open()
  73.     objStream.Type = adTypeText
  74.     objStream.Charset = "windows-1251"
  75.     objStream.WriteText(s)
  76.     objStream.Flush()
  77.     objStream.Position = 0
  78.     objStream.Charset = "utf-8"
  79.     sc = objStream.ReadText(adReadAll)
  80.     objStream.Close()
  81. End Function
  82.  
  83. ' Функции для работы с двоичными данными
  84. Function DecimalToBinary(Number)
  85.     Do
  86.        DecimalToBinary = Hex(Number Mod 16) & DecimalToBinary
  87.        Number = Number \ 16
  88.     Loop Until Number = 0
  89.     DecimalToBinary = Right(DecimalToBinary, 2) & " " & Left(DecimalToBinary, 2)
  90. End Function
  91.  
  92. Function BinaryToDecimal(S)
  93.     BinaryToDecimal = CInt("&H" & Right(S, 2) & Left(S, 2))
  94. End Function
  95.  
  96. Function s2a(s)
  97.   ReDim a(Len(s) - 1)
  98.   Dim i
  99.   For i = 0 To UBound(a)
  100.       a(i) = Mid(s, i + 1, 1)
  101.   Next
  102.   s2a = a
  103. End Function
  104.  
  105. Function s2h(s)
  106.   Dim a : a = s2a(s)
  107.   Dim i
  108.   For i = 0 To UBound(a)
  109.       a(i) = Right(00 & Hex(Asc(a(i))), 2)
  110.   Next
  111.   s2h = Join(a)
  112. End Function
  113.  
  114. Function h2s(h)
  115.   Dim a : a = Split(h)
  116.   Dim i
  117.   For i = 0 To UBound(a)
  118.       a(i) = Chr("&H" & a(i))
  119.   Next
  120.   h2s = Join(a, "")
  121. End Function
  122.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement