冰楓論壇

標題: ASI類 腳本 編寫 修改 漢化 Native Trainer 開源計畫 - 原始碼已中文化 [打印本頁]

作者: 馬狗    時間: 2015-5-10 23:50
標題: ASI類 腳本 編寫 修改 漢化 Native Trainer 開源計畫 - 原始碼已中文化
轉發請保留該字樣:「[L4D WInd && OB]」 昔日的戰友OB又復活歸來。。



說點題外話:
說是開源,其實本身Native Trainer就是開源的我只是整合、修改、漢化部分代碼,所以相當的慚愧,國內基本上找不到此類話題的網站,那不如從此帖開始,慢慢的整合一群志同道合的朋友,共同研究,為大家創造更多的插件,打個簡單的比方外掛,敢於開源的人少之又少,及時開源也是過期的東西。國情就是如此,也只能感慨一番。   
我相信付出都會有收穫,也因為這種精神我認識了許多志同道合的朋友,從最初的pvpgn、bnetd project此類開源項目,讓我學習到這種精神,讓我印象最為深刻的就是SourceMod類[Half Life]插件,幾乎是共享的,有很多優秀的作品,L4D1代,我製作了LXD、Random event、viprank等插件,如當初我不開源,沒有那群志同道合的朋友,也不至於能霸佔全球rank第一如此之久,也不會在L4D2的時候還能看到我製作的hack能夠得到延續,也不會看到一批一批優秀的製作者。


所以我想說,共同進步的同時又能方便廣大玩家,何樂而不為。So 此帖不光開源,也會在空餘時間進行授課,對SDK進行慢慢的翻譯,逐漸更新,個人思想始終是有侷限的,期待大家的共同加入。

第一篇帖子權當基礎教程,我並非是c++高手,只是趨於愛好,逐漸學習,學學忘忘。【不足之處還望指正,學習就是摸索、研究、請教
1、什麼是Asi
Asi是Script Hook V的腳本文件,與其說是腳本,我認為不如說是DLL文件更為恰當,用Editplus類軟件編輯Asi文件時,都能看到文件頭的標準win32結構,Script Hook從字面瞭解,就能明白,通過hook(例如我給你打電話,中間需要一個基站,hook你可以看作一個偽造的基站,攔截正規基站的信息,然後對其發出修改後的指令,然後得到結果,外掛常用的一種形式)創建我們需要功能,讓Script Hook來識別,並在遊戲內體現出來。而Asi的書寫結構是標準的c++結構,所以說大家還是學c++吧,哈哈。

2、如何編譯Asi
安裝VS2013,打開 SourcesamplesNativeTrainer.sln 工程文件,然後如圖所示,下方會有簡要提示,無論是否編譯成功。
133524iz4rrnm70ouh7uo4.png



3、關於中文編譯
採用中文需要注意事項,首先編碼必須是utf8,然後字符集必須採用"使用 Unicode 字符集", 因為編碼的問題(這是我的猜測,我在很早以前看到過GTA系列是單字節遊戲,漢化也是採取的外掛形式,在實際測試過程中,亂碼問題,建議全部採取繁體中文書寫,如果編譯出現錯誤C2001,偶數中文背後加上英文符,或gbk to utf8字符轉換)
133529cpg4hp7n2n6tcuww.png


4、代碼基礎講解
因為代碼都是標準的C++結構,所以這裡不對最基礎的指令進行說明,只對針對遊戲有作用的代碼進行說明。首先來看一段代碼,代碼內能備註的,我都進行備註

創建菜單函數,創建菜單的方式有許多種,這裡只以其中之一進行說明,該函數涵蓋本附件源碼內的基礎功能

首先看創建菜單的一個功能
  1. draw_menu_line(caption, 350.0, 15.0, 18.0, 0.0, 5.0, false, true);
複製代碼
後面一堆參數怎麼知道表達的是什麼意思?你可以在vs中搜索draw_menu_line後會出現下方的代碼,相對應後你就知道都是什麼意思了,或者直接在vs中自己手動鍵入draw_menu_line他也會提示,那麼翻譯出現就是
  1. //draw_menu_line(文本,寬度,高度,頂位置,左邊位置,文本位置,是否可選中,是否為標題,自動調整文本(不指定則為true))
複製代碼
那麼我們繼續看下面的一段代碼
  1. void update_status_text()
  2. {
  3.         if (GetTickCount() < statusTextDrawTicksMax)
  4.         {
  5.                 UI::SET_TEXT_FONT(0);
  6.                 UI::SET_TEXT_SCALE(0.55, 0.55);
  7.                 UI::SET_TEXT_COLOUR(243, 23, 84, 255);
  8.                 UI::SET_TEXT_WRAP(0.0, 1.0);
  9.                 UI::SET_TEXT_CENTRE(0);
  10.                 UI::SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0);
  11.                 UI::SET_TEXT_EDGE(1, 0, 0, 0, 205);
  12.                
  13.                 if (statusTextGxtEntry)
  14.                 {
  15.                         UI::_SET_TEXT_ENTRY((char *)statusText.c_str());
  16.                 } else
  17.                 {
  18.                         UI::_SET_TEXT_ENTRY("STRING");
  19.                         UI::_ADD_TEXT_COMPONENT_STRING((char *)statusText.c_str());
  20.                 }
  21.                 UI::_DRAW_TEXT(0.5, 0.5);
  22.         }
  23. }
複製代碼
突然想起來一個嚴重的問題,那必須要說下,且到了上班的點了,也不夠時間了。
  1. void main() //初始入口,例如我在另外一篇帖子中發的online_bypass源碼,如果你需要用,那麼就需要加在這裡,我備註過(備註也等同於讓這段代碼失效)的部分就是了,
  2. {        
  3. //#include "bypass.h"        

  4.        //online_bypass.h();
  5.        reset_globals();  //這裡是對所有變量進行初始賦值,我遇到過一個BUG,直接複製粘貼進去的變量是失效的,如果遇到此類問題,建議手打,編譯的時候不會出現錯誤警告。

  6.         while (true)  //正文中我提到過,可以把asi看成一個dll,在main.cpp中一看便知,插件只會加載一次,具體見main.cpp,和本文無關不做解釋了
  7.         {
  8.                 if (trainer_switch_pressed()) //搜索trainer_switch_pressed 得知此段代碼意思  如果f4被按下
  9.                 {
  10.                         menu_beep(); //搜索得知,播放聲音
  11.                         process_main_menu();  //執行process_main_menu參數
  12.                 }

  13.                 update_features(); 否則執行update_features()函數,有時候我們發現修改的功能失效,按下F4,再關閉後即可生效,update_features掌管了大部分的修改功能。
  14.                 WAIT(0);
  15.         }
  16. }
複製代碼
process_main_menu() 解釋
  1. int activeLineIndexMain = 0; //定義一個初始值

  2. void process_main_menu()
  3. {
  4.         const float lineWidth = 300.0;  //表格寬度
  5.         const int lineCount = 10;         //行數
  6.         
  7.         std::string caption = "NATIVE  TRAINER  (AB) PLus BY WInD";  //std string caption  記得這裡嗎?前文中創建菜單那裡提到過,標題的類型就是 std string,caption是自定義的參數名
  8.         static LPCSTR lineCaption[lineCount] = {  //創建表格
  9.                 "玩家選項",
  10.                 "武器選項",
  11.                 "載具選項",
  12.                 "世界選項",
  13.                 "時間選項",
  14.                 "天氣選項",
  15.                 "其他雜項",
  16.                 "在線解鎖",
  17.                 "等級修改",
  18.                 "增強部分 BY WInD"    //結尾是沒有,號的
  19.         };

  20.         DWORD waitTime = 150;   /定義一個變量
  21.         while (true)
  22.         {
  23.                 // timed menu draw, used for pause after active line switch
  24.                 DWORD maxTickCount = GetTickCount() + waitTime;   //該段代碼中的GetTickCount()在main菜單中,可以看到有個參數,創建了一個隨機數種子,而GetTickCount()在update_status_text()中有有一個判斷,主要用於解決同時創建菜單造成的字體顏色混淆作用
  25.                 do
  26.                 {
  27.                         // draw menu
  28.                         draw_menu_line(caption, lineWidth, 15.0, 18.0, 0.0, 5.0, false, true);  //這裡不做解釋了,上面已經解釋過了,至說明一下創建過程經過
  29.                         for (int i = 0; i < lineCount; i++)  //循環,賦值i=0 如果 i<linecount 則跳出循環,否則i++後繼續執行,如果i<10,也就是執行10次後,i="10了,那麼則跳出循環。
  30.                                 if (i != activeLineIndexMain)  //如果I 不等於activeLineIndexMain(該值初始值為0,也就是說0不等於0的情況下) 則執行 draw_menu_line(lineCaption[i], lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);
  31.                                         draw_menu_line(lineCaption[i], lineWidth, 9.0, 60.0 + i * 36.0, 0.0, 9.0, false, false);   //創建菜單 以此從第一項創建到10項,結尾的兩個false,則代表他們既不是標題也是可選中項目,可以這樣理解他這裡是為了防止BUG才這樣處理的, 在本段代碼開頭,如果第一次創建的話,因為按了F4以後,我們首選就是菜單的第一個項目上了,那麼接下來我們要創建的是2~9項目,用於防止重複創建,可以不用理解,直接調用即可,這裡只是做一個說明。
  32.                         draw_menu_line(lineCaption[activeLineIndexMain], lineWidth + 1.0, 11.0, 56.0 + activeLineIndexMain * 36.0, 0.0, 7.0, true, false);
  33.                         
  34.                         update_features(); //創建完畢後,立即執行參數,該段後面會大致講解。
  35.                         WAIT(0); //延時
  36.                 } while (GetTickCount() < maxTickCount);
  37.                 waitTime = 0;

  38.                 // process buttons
  39.                 bool bSelect, bBack, bUp, bDown;  //邏輯參數  選擇 返回 前 後
  40.                 get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);  //獲取key設置值,以後會講解,來不及了,要上班了
  41.                 if (bSelect)  //如果按下選擇按鈕
  42.                 {
  43.                         menu_beep(); //發聲
  44.                         switch (activeLineIndexMain)  //選擇
  45.                         {
  46.                                 case 0:
  47.                                         process_player_menu();                          //第一項進入                process_player_menu()
  48.                                         break;
  49.                                 case 1:
  50.                                         process_weapon_menu();   //第二項進入 process_weapon_menu() 後面以此類推
  51.                                         break;
  52.                                 case 2:
  53.                                         process_veh_menu();
  54.                                         break;
  55.                                 case 3:
  56.                                         process_world_menu();
  57.                                         break;
  58.                                 case 4:
  59.                                         process_time_menu();
  60.                                         break;
  61.                                 case 5:
  62.                                         process_weather_menu();
  63.                                         break;
  64.                                 case 6:
  65.                                         process_misc_menu();
  66.                                         break;
  67.                                 case 7:
  68.                                         set_status_text("[自用功能,不影響和諧]");
  69.                                         //process_rec_menu();
  70.                                         break;
  71.                                 case 8:
  72.                                         set_status_text("[自用功能,不影響和諧]");
  73.                                         //process_level_menu();
  74.                                         break;
  75.                                 case 9:
  76.                                         process_about_menu();
  77.                                         break;
  78.                         }
  79.                         waitTime = 200;
  80.                 } else //如果沒有進行選擇操作
  81.                 if (bBack || trainer_switch_pressed())   //如果是 返回 或按下f4
  82.                 {
  83.                         menu_beep();
  84.                         break; //中段
  85.                 } else
  86.                 if (bUp)  //如果按向上按鈕
  87.                 {
  88.                         menu_beep();
  89.                         if (activeLineIndexMain == 0)  
  90.                                 activeLineIndexMain = lineCount; //一些賦值,不說明了,可以自己對比兩個值在不同位置的作用,來做比較
  91.                         activeLineIndexMain--;
  92.                         waitTime = 150;
  93.                 } else
  94.                 if (bDown)
  95.                 {
  96.                         menu_beep();
  97.                         activeLineIndexMain++;
  98.                         if (activeLineIndexMain == lineCount)
  99.                                 activeLineIndexMain = 0;                        
  100.                         waitTime = 150;
  101.                 }
  102.         }
  103. }
複製代碼
前文中我們提到了
  1. get_button_state(&bSelect, &bBack, &bUp, &bDown, NULL, NULL);  //獲取key設置值,以後會講解,來不及了,要上班了
複製代碼
該段代碼中我們可以追蹤代碼段,得到
  1. void get_button_state(bool *a, bool *b, bool *up, bool *down, bool *l, bool *r)  //
  2. {
  3.         if (a) *a = IsKeyDown(VK_NUMPAD5); //整段的作用很明確,就是為了定義熱鍵按鈕,key代碼可以在[url]http://blog.sina.com.cn/s/blog_7006ccc10101bnmr.html[/url]中查詢
  4.         if (b) *b = IsKeyDown(VK_NUMPAD0) || trainer_switch_pressed() || IsKeyDown(VK_BACK);
  5.         if (up) *up = IsKeyDown(VK_NUMPAD8);
  6.         if (down) *down = IsKeyDown(VK_NUMPAD2);
  7.         if (r) *r = IsKeyDown(VK_NUMPAD6);
  8.         if (l) *l = IsKeyDown(VK_NUMPAD4);
  9. }
複製代碼
前文中多次提到過update_features,那麼作為本次代碼講解的結束,我想再合適不過了
  1. void update_features()  //從名稱就可以看出,這裡主要用做刷新、更新作用,當然這些你都可以自定義的
  2. {
  3.         update_status_text(); //前面提到過,不再說嘛

  4.         update_vehicle_guns(); //本函數作用類似於我們正在講解的,也不做說明

  5.         // changing player model if died/arrested while being in another skin, since it can cause inf loading loop
  6.         if (skinchanger_used)  //先追蹤變量,其實問中我多次用到參數變量等詞彙,有時候是一個意思,因為我不是專業寫教程的,難免有時候自己錯亂一下,可以得到 該值為true的情況下,必須是在更換過人物模型後,這2段都是為了檢查人物如果死亡後,狀態又在刷新,防止角色卡死
  7.                 check_player_model();

  8.         // wait until player is ready, basicly to prevent using the trainer while player is dead or arrested
  9.         while (ENTITY::IS_ENTITY_DEAD(PLAYER::PLAYER_PED_ID()) || PLAYER::IS_PLAYER_BEING_ARRESTED(PLAYER::PLAYER_ID(), TRUE))  //本段內容同上,都是為了檢查角色狀態的, 死亡或正在創建過程中 那麼腳本就繼續等待 循環判斷指令
  10.                 WAIT(0);

  11.         // read default feature values from the game
  12.         featureWorldRandomCops = PED::CAN_CREATE_RANDOM_COPS() == TRUE; //給featureWorldRandomCops變量賦予默認值true,並讓SDK中我們查詢得到的是否允許創建隨機的警察該值也為true.

  13.         // common variables
  14.         Player player = PLAYER::PLAYER_ID();  //變量定義,玩家ID,這3段主要是為了後面的書寫進行定義的,這裡的第一個Player,是SDK包含的自定義數據類型,可以看作是 DWORD數據類型
  15.         Ped playerPed = PLAYER::PLAYER_PED_ID();         //角色模型ID 同上
  16.         BOOL bPlayerExists = ENTITY::DOES_ENTITY_EXIST(playerPed); //邏輯數據類型玩家是否退出 傳遞

  17.         // player invincible
  18.         if (featurePlayerInvincibleUpdated)  //追蹤該變量featurePlayerInvincibleUpdated可以知道,這段變量是用於判斷是否進行過玩家無敵的操作,作用在於,每次進行還原,再進行無敵操作,下面的代碼就能夠看的出來
  19.         {
  20.                 if (bPlayerExists && !featurePlayerInvincible) // 玩家是否退出 並且檢查另外一個變量,上面的featurePlayerInvincibleUpdated同時還控制著 ON OFF開關的顯示
  21.                         PLAYER::SET_PLAYER_INVINCIBLE(player, FALSE); //SDK部分  禁止玩家無敵
  22.                 featurePlayerInvincibleUpdated = false;
  23.         }
  24.         if (featurePlayerInvincible) //同理上面那段
  25.         {
  26.                 if (bPlayerExists)  //檢查玩家是否退出遊戲
  27.                         PLAYER::SET_PLAYER_INVINCIBLE(player, TRUE);  //沒有,那就無敵吧
  28.         }

  29.         // player never wanted
  30.         if (featurePlayerNeverWanted)  //同理上面,因為是SDK部分,所以不做說明,所以說如果能夠搞清楚遊戲的SDK,那麼你可以實現很多的功能,這是一個艱巨而漫長的過程。
  31.         {
  32.                 if (bPlayerExists)
  33.                         PLAYER::CLEAR_PLAYER_WANTED_LEVEL(player);
  34.         }

  35.         // police ignore player
  36.         if (featurePlayerIgnoredUpdated)
  37.         {
  38.                 if (bPlayerExists)
  39.                         PLAYER::SET_POLICE_IGNORE_PLAYER(player, featurePlayerIgnored);
  40.                 featurePlayerIgnoredUpdated = false;
  41.         }

  42.         // player special ability
  43.         if (featurePlayerUnlimitedAbility)
  44.         {
  45.                 if (bPlayerExists)
  46.                         PLAYER::_RECHARGE_SPECIAL_ABILITY(player, 1);
  47.         }

  48.         // player no noise
  49.         if (featurePlayerNoNoiseUpdated)
  50.         {
  51.                 if (bPlayerExists && !featurePlayerNoNoise)
  52.                         PLAYER::SET_PLAYER_NOISE_MULTIPLIER(player, 1.0);
  53.                 featurePlayerNoNoiseUpdated = false;
  54.         }
  55.         if (featurePlayerNoNoise)
  56.                 PLAYER::SET_PLAYER_NOISE_MULTIPLIER(player, 0.0);

  57.         // player fast swim
  58.         if (featurePlayerFastSwimUpdated)
  59.         {
  60.                 if (bPlayerExists && !featurePlayerFastSwim)
  61.                         PLAYER::_SET_SWIM_SPEED_MULTIPLIER(player, 1.0);
  62.                 featurePlayerFastSwimUpdated = false;
  63.         }
  64.         if (featurePlayerFastSwim)
  65.                 PLAYER::_SET_SWIM_SPEED_MULTIPLIER(player, 1.49);

  66.         // player fast run
  67.         if (featurePlayerFastRunUpdated)
  68.         {
  69.                 if (bPlayerExists && !featurePlayerFastRun)
  70.                         PLAYER::_SET_MOVE_SPEED_MULTIPLIER(player, 1.0);
  71.                 featurePlayerFastRunUpdated = false;
  72.         }
  73.         if (featurePlayerFastRun)
  74.                 PLAYER::_SET_MOVE_SPEED_MULTIPLIER(player, 1.49);

  75.         // player super jump
  76.         if (featurePlayerSuperJump)
  77.         {
  78.                 if (bPlayerExists)
  79.                         GAMEPLAY::SET_SUPER_JUMP_THIS_FRAME(player);
  80.         }

  81.         // weapon
  82.         if (featureWeaponFireAmmo)
  83.         {
  84.                 if (bPlayerExists)
  85.                         GAMEPLAY::SET_FIRE_AMMO_THIS_FRAME(player);
  86.         }
  87.         if (featureWeaponExplosiveAmmo)
  88.         {
  89.                 if (bPlayerExists)
  90.                         GAMEPLAY::SET_EXPLOSIVE_AMMO_THIS_FRAME(player);
  91.         }
  92.         if (featureWeaponExplosiveMelee)
  93.         {
  94.                 if (bPlayerExists)
  95.                         GAMEPLAY::SET_EXPLOSIVE_MELEE_THIS_FRAME(player);
  96.         }

  97.         // weapon no reload
  98.         if (bPlayerExists && featureWeaponNoReload)  //上面的都差不多,從這裡稍不一樣,那就從這裡開始
  99.         {
  100.                 Hash cur;   //hash數據類型我從來沒有接觸過,能網上百度來的,我絕對不會在這裡跟大家說
  101.                 if (WEAPON::GET_CURRENT_PED_WEAPON(playerPed, &cur, 1))  //這裡不是很清楚,那就去查SDK  Any GET_CURRENT_PED_WEAPON(Ped ped, Hash *weapHash, BOOL p2) // 0xB0237302   判斷 獲取模型手上的槍的hash值,這到底是什麼參數,我暈 如果為真反正就是判斷玩家手上是否有槍就對了,並且把這把槍的值賦到cur變量中
  102.                 {
  103.                         if (WEAPON::IS_WEAPON_VALID(cur))  //如果是一把有效的槍,或者說你把槍切換出來了
  104.                         {
  105.                                 int maxAmmo; //定義一個最大的子彈數
  106.                                 if (WEAPON::GET_MAX_AMMO(playerPed, cur, &maxAmmo))   //獲取這把槍的最大彈藥數,這裡是獲取,而不是制定,也就說,你可以不要這段代碼,然後下面那段代碼,按照我的方法修改是同理
  107.                                 {
  108.                                         WEAPON::SET_PED_AMMO(playerPed, cur, maxAmmo);  //這樣修改 WEAPON::SET_PED_AMMO(playerPed, cur, 10) 這樣也可以,以此類推。不過這樣改了就不能不用裝彈了,原理未知,光從代碼上看,還不足以實現無須裝彈

  109.                                         maxAmmo = WEAPON::GET_MAX_AMMO_IN_CLIP(playerPed, cur, 1);  //最大彈夾數
  110.                                         if (maxAmmo > 0)  //如果彈夾高於0
  111.                                                 WEAPON::SET_AMMO_IN_CLIP(playerPed, cur, maxAmmo);  //那麼設置一個最大彈夾
  112.                                 }
  113.                         }
  114.                 }
  115.         }

  116.         // player's vehicle invincible
  117.         if (featureVehInvincibleUpdated)  //載具無敵,同理上面,先進行一次還原,再進行無敵操作
  118.         {
  119.                 if (bPlayerExists && !featureVehInvincible && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  120.                 {
  121.                         Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  122.                         ENTITY::SET_ENTITY_INVINCIBLE(veh, FALSE);
  123.                         ENTITY::SET_ENTITY_PROOFS(veh, 0, 0, 0, 0, 0, 0, 0, 0);
  124.                         VEHICLE::SET_VEHICLE_TYRES_CAN_BURST(veh, 1);
  125.                         VEHICLE::SET_VEHICLE_WHEELS_CAN_BREAK(veh, 1);
  126.                         VEHICLE::SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(veh, 1);
  127.                 }
  128.                 featureVehInvincibleUpdated = false;
  129.         }
  130.         if (featureVehInvincible)
  131.         {
  132.                 if (bPlayerExists && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  133.                 {
  134.                         Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  135.                         ENTITY::SET_ENTITY_INVINCIBLE(veh, TRUE);
  136.                         ENTITY::SET_ENTITY_PROOFS(veh, 1, 1, 1, 1, 1, 1, 1, 1);         //變動處 SDK:void SET_ENTITY_PROOFS(Entity Entity, BOOL bulletProof, BOOL fireProof, BOOL explosionProof, BOOL collisionProof, BOOL meleeProof, Any p6, Any p7, Any p8) // 0x7E9EAB66  對應SDK就一目瞭然
  137.                         VEHICLE::SET_VEHICLE_TYRES_CAN_BURST(veh, 0);
  138.                         VEHICLE::SET_VEHICLE_WHEELS_CAN_BREAK(veh, 0);
  139.                         VEHICLE::SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(veh, 0);
  140.                 }
  141.         }

  142.         // player's vehicle boost
  143.         if (featureVehSpeedBoost && bPlayerExists && PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))
  144.         {
  145.                 Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  146.                 DWORD model = ENTITY::GET_ENTITY_MODEL(veh);

  147.                 bool bUp = IsKeyDown(VK_NUMPAD9);
  148.                 bool bDown = IsKeyDown(VK_NUMPAD3);

  149.                 if (bUp || bDown) //這裡為汽車加速,並定義了2個熱鍵,用於實現汽車加速的
  150.                 {                        
  151.                         float speed = ENTITY::GET_ENTITY_SPEED(veh);
  152.                         if (bUp)
  153.                         {
  154.                                 speed += speed * 0.05f; //speed=speed+speed*0.05f
  155.                                 VEHICLE::SET_VEHICLE_FORWARD_SPEED(veh, speed);
  156.                         } else
  157.                         if (ENTITY::IS_ENTITY_IN_AIR(veh) || speed > 5.0)
  158.                                 VEHICLE::SET_VEHICLE_FORWARD_SPEED(veh, 0.0);
  159.                 }
  160.         }

  161.         // time pause
  162.         if (featureTimePausedUpdated)
  163.         {
  164.                 TIME::PAUSE_CLOCK(featureTimePaused);
  165.                 featureTimePausedUpdated = false;
  166.         }

  167.         // time sync
  168.         if (featureTimeSynced)
  169.         {
  170.                 time_t now = time(0);
  171.                 tm t;
  172.                 localtime_s(&t, &now);
  173.                 TIME::SET_CLOCK_TIME(t.tm_hour, t.tm_min, t.tm_sec);
  174.         }

  175.         if (featureVehAllMod)  //載具自動改造,具體自己去查SDK
  176.         {
  177.                 Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  178.                 VEHICLE::SET_VEHICLE_MOD_KIT(veh, 0);   // sdk 解釋 SET_VEHICLE_MOD_KIT(Vehicle vehicle, int unknown) // 0xB8132158  SDK部分都還暫時不明所以,沒人更新,如果你知道,你可以去管網更新,這樣大家以後下載最新的SDK,就有解釋
  179.                 VEHICLE::SET_VEHICLE_COLOURS(veh, 120, 120);
  180.                 VEHICLE::SET_VEHICLE_NUMBER_PLATE_TEXT(veh, (Any*)"KINKYHAX");
  181.                 VEHICLE::SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(veh, 1);
  182.                 VEHICLE::TOGGLE_VEHICLE_MOD(veh, 18, 1);
  183.                 VEHICLE::TOGGLE_VEHICLE_MOD(veh, 22, 1);
  184.                 VEHICLE::SET_VEHICLE_MOD(veh, 16, 5, 0);
  185.                 VEHICLE::SET_VEHICLE_MOD(veh, 12, 2, 0);
  186.                 VEHICLE::SET_VEHICLE_MOD(veh, 11, 3, 0);
  187.                 VEHICLE::SET_VEHICLE_MOD(veh, 14, 14, 0);
  188.                 VEHICLE::SET_VEHICLE_MOD(veh, 15, 3, 0);
  189.                 VEHICLE::SET_VEHICLE_MOD(veh, 13, 2, 0);
  190.                 VEHICLE::SET_VEHICLE_WHEEL_TYPE(veh, 6);
  191.                 VEHICLE::SET_VEHICLE_WINDOW_TINT(veh, 5);
  192.                 VEHICLE::SET_VEHICLE_MOD(veh, 23, 19, 1);
  193.                 VEHICLE::SET_VEHICLE_MOD(veh, 0, 1, 0);
  194.                 VEHICLE::SET_VEHICLE_MOD(veh, 1, 1, 0);
  195.                 VEHICLE::SET_VEHICLE_MOD(veh, 2, 1, 0);
  196.                 VEHICLE::SET_VEHICLE_MOD(veh, 3, 1, 0);
  197.                 VEHICLE::SET_VEHICLE_MOD(veh, 4, 1, 0);
  198.                 VEHICLE::SET_VEHICLE_MOD(veh, 5, 1, 0);
  199.                 VEHICLE::SET_VEHICLE_MOD(veh, 6, 1, 0);
  200.                 VEHICLE::SET_VEHICLE_MOD(veh, 7, 1, 0);
  201.                 VEHICLE::SET_VEHICLE_MOD(veh, 8, 1, 0);
  202.                 VEHICLE::SET_VEHICLE_MOD(veh, 9, 1, 0);
  203.                 VEHICLE::SET_VEHICLE_MOD(veh, 10, 1, 0);
  204.         }

  205.         if (featureVehSlide)
  206.         {
  207.                 VEHICLE::SET_VEHICLE_REDUCE_GRIP(PED::GET_VEHICLE_PED_IS_IN(PLAYER::PLAYER_PED_ID(), 0), 1);
  208.         }
  209.         else
  210.         {
  211.                 VEHICLE::SET_VEHICLE_REDUCE_GRIP(PED::GET_VEHICLE_PED_IS_IN(PLAYER::PLAYER_PED_ID(), 0), 0);
  212.         }

  213.         if (featureVehRainbow)  //這裡說下彩虹冊車,說實話我還不知道update_features()是如何自動刷新的,因為代碼我還沒有全部看完,慢慢講解,慢慢自己研究看看。
  214.         {
  215.                 Vehicle veh = PED::GET_VEHICLE_PED_IS_USING(playerPed);
  216.                 DWORD model = ENTITY::GET_ENTITY_MODEL(veh);

  217.                 if (PED::IS_PED_IN_ANY_VEHICLE)  //如果玩家在車輛內,其實這裡有個BUG的,應該還要加一段判斷  PLAYER::IS_PLAYER_CONTROL_ON(player) &&        PED::IS_PED_IN_ANY_VEHICLE(playerPed, 0))  這樣才不會在還沒有上車的時候就出現問題.
  218.                 {
  219.                         VEHICLE::SET_VEHICLE_CUSTOM_PRIMARY_COLOUR(veh, rand() % 255, rand() % 255, rand() % 255);  //設置隨機顏色
  220.                         WAIT(150); //延時150

  221.                         VEHICLE::SET_VEHICLE_CUSTOM_SECONDARY_COLOUR(veh, rand() % 255, rand() % 255, rand() % 255);
  222.                         WAIT(150);
  223.                 }
  224.         }

  225.         if (featureVehStickyCar)
  226.         {
  227.                 if (PED::IS_PED_IN_ANY_VEHICLE(PLAYER::PLAYER_PED_ID(), 0))
  228.                 {
  229.                         int myVehicle = PED::GET_VEHICLE_PED_IS_USING(PLAYER::PLAYER_PED_ID());
  230.                         VEHICLE::SET_VEHICLE_ON_GROUND_PROPERLY(myVehicle);
  231.                 }
  232.         }

  233.         // hide hud
  234.         if (featureMiscHideHud)
  235.                 UI::HIDE_HUD_AND_RADAR_THIS_FRAME();

  236. }
複製代碼
5、SDK整理翻譯
網站地址:http://www.dev-c.com/nativedb/   該SDK由網友維護更新,可隨時去更新,這樣才會有一些新的備註,不會出現類似於unnkow情況發生.SDK部分需要很長時間研究
PLAYER [203]              玩家部分
ENTITY [150]                                                        實體
PED [525]                                                                        角色模型
VEHICLE [476]                                                        車輛相關
OBJECT [101]                                                        對象
AI [274]                                                                        AI
GAMEPLAY [254]                                                操作類
AUDIO [217]                                                                音樂類
CUTSCENE [41]                                                        動畫類
INTERIOR [33]                                                        室內
CAM [191]                                                                        攝像機
WEAPON [86]                                                                武器
ITEMSET [9]
STREAMING [112]
SCRIPT [25]                                                                腳本
UI [407]                                                                        界面
GRAPHICS [286]                                                圖形
STATS [137]                                                                統計
BRAIN [11]
MOBILE [15]                                                                手機
APP [17]
TIME [15]                                                                        時間
PATHFIND [51]
CONTROLS [32]                                                        控制
DATAFILE [50]
FIRE [15]                                                                        火
DECISIONEVENT [13]
ZONE [9]
ROPE [42]                                                                        範圍
WATER [6]                                                                        水
WORLDPROBE [10]
NETWORK [619]                                                        網絡
NETWORKCASH [76]                                        高級網絡 金錢?
DLC1 [38]
DLC2 [7]
SYSTEM [24]                                                                系統
DECORATOR [10]
UNK_SC [49]
UNK [8]

6、文件結構

SDK部分:
sourceincenums.h

sourceincmain.h
sourceinc
ativeCaller.h
sourceincatives.h   SDK主要文件,網上更新也是更新該文件
sourceinc        ypes.h    自定義數據類型文件

Lib文件:
sourcelibScriptHookV.lib


可編寫腳本文件:
sourcelibsamplesNativeTrainerkeyboard.h
sourcelibsamplesNativeTrainerkeyboard.cpp
sourcelibsamplesNativeTrainermain.cpp   看結構就是一個DLL
sourcelibsamplesNativeTrainerscript.cpp   主要代碼存放文件
sourcelibsamplesNativeTrainerscript.h


原始碼:





歡迎光臨 冰楓論壇 (https://bingfong.com/) Powered by 冰楓